Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Grande número de colunas, Selecionar tudo leva uma eternidade


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 um TEXT . 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.