Por que o MySQL não usa um índice?
O MySQL não usará um índice se uma grande porcentagem das linhas têm esse valor.
Por que adicionar
use index
para a consulta não funcionar aqui Adicionando um
use index
cláusula não terá efeito, porque use index
apenas sugerirá quais índice a ser usado, ele não sugerirá o uso de um índice ou não. Atenção ao usar tabelas de teste com poucas linhas
Isto é especialmente irritante ao usar tabelas de teste com poucas linhas, pois o MySQL se recusará a usar um índice e é difícil ver o que há de errado com sua consulta.
Então certifique-se de adicionar linhas suficientes a uma tabela de teste para torná-lo um teste realista.
O uso de um índice em colunas de baixa cardinalidade é inútil?
A indexação em colunas booleanas não é tão útil como você pensou antes de fazer esta pergunta.
No entanto, também não é inútil também.
Com InnoDB O MySQL tentará recuperar dados usando os índices, se possível, se seu campo booleano tiver um índice, a consulta:
SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1
Pode ler todos os dados no índice de cobertura para
bool_field
porque os índices secundários no InnoDB sempre incluem o índice primário (id) também.Isso é mais rápido porque o MySQL não precisa ler a tabela inteira na memória.
No MyISAM isso não funciona e o MySQL examinará a tabela inteira.
Mas eu posso usar
force index
Você pode, mas em índices de baixa cardinalidade isso tornará sua consulta mais lenta, não mais rápida. Apenas substitua os índices em consultas complexas e somente se você conhece as regras que o MySQL usa para selecionar índices.
Links:
Veja:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
e: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
Se você quiser um livro sobre esse assunto:leia
MySQL de alto desempenho:http://oreilly.com /catálogo/9780596003067