Arjen Lentz propose la requête suivante pour détecter les index qui ne servent à rien dans MySQL :
SELECT s.table_name, concat(s.index_name,'(',group_concat(s.column_name order by s.seq_in_index),')') as idx, GROUP_CONCAT(s.cardinality ORDER BY s.seq_in_index) AS card, t.table_rows FROM information_schema.tables t JOIN information_schema.statistics s USING (table_schema,table_name) WHERE t.table_schema='dbname' AND t.table_rows > 1000 AND s.non_unique GROUP BY s.table_name,s.index_name HAVING (card + 0) < (t.table_rows / 3);
La requête utilise la base information_schema (MySQL 5.0 et supérieur), pour repérer les index dont la cardinalité est inférieure à 30% : c'est le niveau à partir duquel MySQL va décider que l'index est utile, et en dessous de ce niveau, MySQL décidera d'ignorer l'index et de tout analyser. Cela revient à décider de tout ranger quand le désordre est tellement grand que corriger les erreurs sera beaucoup plus long encore.
- Arjen's Journal - Finding useless indexes
SELECT s.table_name, concat(s.index_name,'(',group_concat(s.column_name order by s.seq_in_index),')') as idx, GROUP_CONCAT(s.cardinality ORDER BY s.seq_in_index) AS card, t.table_rows FROM information_schema.tables t JOIN information_schema.statistics s USING (table_schema,table_name) WHERE t.table_schema='dbname' AND t.table_rows > 1000 AND s.non_unique GROUP BY s.table_name,s.index_name HAVING (card + 0) < (t.table_rows / 3);
La requête utilise la base information_schema (MySQL 5.0 et supérieur), pour repérer les index dont la cardinalité est inférieure à 30% : c'est le niveau à partir duquel MySQL va décider que l'index est utile, et en dessous de ce niveau, MySQL décidera d'ignorer l'index et de tout analyser. Cela revient à décider de tout ranger quand le désordre est tellement grand que corriger les erreurs sera beaucoup plus long encore.
- Arjen's Journal - Finding useless indexes
-
Auteur
-
Origine