O InnoDB armazena tabelas "amplas" de uma maneira diferente. Em vez de ter todas as colunas juntas em uma única string (mais sobrecarga, como comprimentos etc.), ele faz o seguinte:
- Se o total de todas as colunas de uma determinada linha exceder cerca de 8 KB, alguns dos dados serão movidos para outra área de armazenamento ("off-record").
- Quais colunas são movidas para fora do registro depende dos tamanhos das colunas etc.
- Os detalhes dependem do
ROW_FORMAT
escolhido. - "Off-record" é outro bloco (ou blocos) de 16 KB.
- Mais tarde, ao fazer
SELECT *
(ou pelo menos buscar a(s) coluna(s) off-record), ele deve fazer outra busca de disco.
O que fazer?
- Repense em ter tantas colunas.
- Considere "particionamento vertical", em que você tem outra(s) tabela(s) que contém
TEXT
selecionado colunas. Sugira escolher grupos de colunas com base nos padrões de acesso em seu aplicativo. - Para colunas que geralmente são muito longas, considere compactá-las no cliente e armazená-las em um
BLOB
em vez de umTEXT
. A maioria dos "textos" encolhe 3:1. Os blobs são enviados off-record da mesma forma que os textos, no entanto, esses blobs compactados seriam menores, portanto, menos propensos a derramar. - Faça mais processamento em SQL -- para evitar o retorno de todas as linhas, ou para evitar o retorno do texto completo, etc. não apenas o
SELECT
, em si.