EXPLAIN affiche la valeur
ALL dans la colonne type
lorsque MySQL utilise n scan de table pour résoudre une
requête. Cela arrive lorsque :
La table est si petite qu'il est plus rapide d'analyser la table que d'utiliser les index. C'est un cas courant pour les tables de moins de 10 lignes, et de taille de ligne faible.
Il n'y a pas de restriction exploitable sur les conditions
ON et WHERE, avec les
colonnes indexées.
Vous comparez des colonnes indexées avec des constantes, et
MySQL a calculé, en se basant sur l'arbre d'index, que les
constantes couvrent une trop grande partie de la table : un
scan devrait être plus rapide. See
Section 7.2.4, « Comment MySQL optimise les clauses WHERE ».
Vous utilisez une clé avec une cardinalité faible (c'est à dire, beaucoup de lignes sont trouvées). MySQL va alors supposer que l'utilisation de l'index va lui imposer beaucoup de recherches, et qu'un scan de table sera plus rapide.
Ce que vous pouvez faire pour éviter les scans de grosses tables :
Utilisez ANALYZE TABLE sur les tables
pour optimiser la distribution des clés. See
Section 13.5.2.1, « Syntaxe de ANALYZE TABLE ».
Utilisez FORCE INDEX sur les tables, pour
dire à MYSQL que les scans de tables sont trop coûteux,
comparé à l'utilisation de l'index. See
Section 13.1.7, « Syntaxe de SELECT ».
SELECT * FROM t1,t2 force index(index_for_column) WHERE t1.column=t2.column;
Lancez mysqld avec
--max-seeks-for-key=1000 ou faites
SET MAX_SEEKS_FOR_KEY=1000 pour dire à
l'optimiseur que les scans sans index ne généreront pas
plus de 1000 recherches dans les index. See
Section 5.2.3, « Variables serveur système ».
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.
