XOOPS Brasil

 

A.6. Assuntos Relacionados ao Otimizador

O MySQL usa um otimizador baseado no custo para descobrir o melhor modo de resolver uma consulta. Em muitos casos o MySQL pode calcular a melhor consulta possível mas em alguns casos o MySQL não tem informação suficiente sobre os dados e precisa fazer alguns palpites sobre os dados.

Esta seção do manual é direcionada para os casos nos quais o MySQL não faz isto corretamente.

A ferramenta que se tem disponível para ajudar o MySQL a fazer as coisas 'certas' são:

A.6.1. Camo evitar o varredura da tabela,,,

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.. Veja mais informações sobre isto na Seçã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.. Veja mais informações sobre isto na Seçã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. Veja mais informações sobre isto na Seçã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.