:: DEVELOPER ZONE
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 14.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 14.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 ».
© 1995-2005 MySQL AB. All rights reserved.
