Est-il réaliste d'avoir autant de lignes avec le même price
? Est-il réaliste de renvoyer 444 000 lignes à partir d'une requête ? Je pose ces questions car l'optimisation des requêtes repose sur des données "normales".
Un index (par exemple, INDEX(price)
) est utile pour rechercher un price
qui se produit un petit nombre de fois. En fait, l'optimiseur évite l'index s'il constate que la valeur recherchée apparaît plus de 20 % du temps environ. Au lieu de cela, il ignorerait simplement l'index et ferait ce que vous avez testé en premier :il suffit d'analyser toute la table, en ignorant les lignes qui ne correspondent pas.
Vous devriez pouvoir le voir en faisant
EXPLAIN select * from books where price = 10
avec et sans index. Vous pouvez également essayer :
EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10
Mais, ... Il semble que l'optimiseur n'ait pas ignoré l'index. Je vois que la "cardinalité" de price
est "1", ce qui implique qu'il n'y a qu'une seule valeur distincte dans cette colonne. Cette « statistique » est soit incorrecte, soit trompeuse. Veuillez exécuter ceci et voir ce qui change :
ANALYZE TABLE books;
Cela recalculera les statistiques via quelques sondes aléatoires, et peut changez ce "1" en peut-être "2".
Conseil général :Méfiez-vous des benchmarks qui s'appuient sur des données fabriquées.