Pourquoi MySQL n'utilise-t-il pas d'index ?
MySQL n'utilisera pas d'index si un pourcentage important des lignes ont cette valeur.
Pourquoi l'ajout de use index
à la requête ne fonctionne pas ici
Ajout d'un use index
clause n'aura aucun effet, car use index
suggérera seulement quel index à utiliser, il ne suggérera pas s'il faut utiliser un index ou non.
Mise en garde lors de l'utilisation de tableaux de test avec peu de lignes
Ceci est particulièrement gênant lorsque vous utilisez des tables de test avec peu de lignes car MySQL refusera d'utiliser un index, et il est difficile de voir ce qui ne va pas avec votre requête.
Assurez-vous donc d'ajouter suffisamment de lignes à une table de test pour en faire un test réaliste.
Est-il inutile d'utiliser un index sur des colonnes à faible cardinalité ?
L'indexation sur les colonnes booléennes n'est pas aussi utile comme vous le pensiez avant de poser cette question.
Cependant, ce n'est pas non plus inutile soit.
Avec InnoDB MySQL essaiera de récupérer les données en utilisant les index si possible, si votre champ booléen a un index la requête :
SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1
Peut lire toutes les données dans l'index de couverture pour bool_field
car les index secondaires dans InnoDB incluent toujours l'index primaire (id) également.
C'est plus rapide car MySQL n'a pas à lire toute la table en mémoire.
Dans MyISAM, cela ne fonctionne pas et MySQL examinera toute la table.
Mais je peux utiliser force index
Vous pouvez, mais sur les index à faible cardinalité, cela rendra votre requête plus lente, pas plus rapide. Ne remplacez les index que sur les requêtes complexes et uniquement si vous connaissez les règles utilisées par MySQL pour sélectionner les index.
Liens :
Voir :http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
et : http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
Si vous voulez un livre sur ce sujet :lisez
MySQL haute performance :http://oreilly.com /catalog/9780596003067