Mysql
 sql >> Base de données >  >> RDS >> Mysql

La requête MySQL est plus lente après la création de l'index

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.