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.