Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Die MySQL-Abfrage ist nach der Indexerstellung langsamer

Ist es realistisch, so viele Zeilen mit demselben price zu haben? ? Ist es realistisch, 444.000 Zeilen aus einer Abfrage zurückzugeben? Ich frage diese, weil die Abfrageoptimierung auf "normalen" Daten basiert.

Ein Index (z. B. INDEX(price) ) ist nützlich, wenn Sie nach einem price suchen das kommt ein paar mal vor. Tatsächlich vermeidet der Optimierer den Index, wenn er feststellt, dass der gesuchte Wert mehr als etwa 20 % der Zeit vorkommt. Stattdessen würde es einfach den Index ignorieren und das tun, was Sie zuerst getestet haben – einfach die gesamte Tabelle scannen und alle Zeilen ignorieren, die nicht übereinstimmen.

Sie sollten das sehen können, indem Sie es tun

EXPLAIN select * from books where price = 10

mit und ohne index. Alternativ können Sie Folgendes versuchen:

EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10

Aber, ... Es scheint, dass der Optimierer den Index nicht ignoriert hat. Ich sehe, dass die "Kardinalität" von price "1" ist, was impliziert, dass es in dieser Spalte nur einen eindeutigen Wert gibt. Diese „Statistik“ ist entweder falsch oder irreführend. Bitte führen Sie dies aus und sehen Sie, was sich ändert:

ANALYZE TABLE books;

Dadurch werden die Statistiken über ein paar zufällige Überprüfungen neu berechnet, und kann ändern Sie diese "1" in vielleicht "2".

Allgemeiner Hinweis:Hüten Sie sich vor Benchmarks, die gegen gefälschte Daten laufen.