EXPLAIN mostrará ALL na
coluna type quando o MySQL usa uma busca na
tabela para resolver uma consulta. Isto acontece normalmente
quando:
A tabela é tão pequena que é mais rápido fazer uma varredura na tabela que uma busca nas chaves. Isto é um caso comum para tabelas com menos de 10 linhas e um tamanho de linha pequeno.
Não há nenhum restrição utilizável na cláusula
ON ou WHERE para
colunas indexadas.
Você está comparando colunas indexadas com constantes e o
MySQL calculou (baseado na árvore de índices) que a
constante cobre uma parte muito grande da tabela e uma busca
na tabela seria mais rápido.. See
Secção 5.2.4, “Como o MySQL Otimiza Cláusulas WHERE”.
Você está usando uma chave com baixa cardinalidade (= muitos registros coincidentes) através de outra coluna. O MySQL assumirá neste caso que usar a chave fará muitas pesquisas de chave e neste caso a varredura da tabela seria mais rápido.
O que você pode fazer para evita uma busca 'errada' em tabelas grandes é:
Use ANALYZE TABLE para a tabela em
quastão atualizar a distribuição das chaves.. See
Secção 4.6.2, “Sintaxe de ANALYZE TABLE”.
Use FORCE INDEX para a tabela em questão
para dizer ao MySQL que uma busca na tabela é muito cara
comparado com usar um dos índices dados. See
Secção 6.4.1, “Sintaxe SELECT”.
SELECT * FROM t1,t2 force index(index_for_column) WHERE t1.column=t2.column;
Inicie o mysqld com
--max-seeks-for-key=1000 ou faça
SET MAX_SEEKS_FOR_KEY=1000 para dizer ao
otimizador que nenhuma busca de chave fará mais que 1000
pesquisas nas chaves.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
