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

MySQL Query verwendet keinen Index in der Tabellenverknüpfung

Wie Sie im EXPLAIN sehen können, wird "book_id" als möglicher Schlüssel aufgeführt. Wenn MySQL es nicht verwendet, ist es nur so, dass der Optimierer nicht glaubt, dass es die Abfrage beschleunigen würde. Das trifft zu, wenn „book_sales“ nur 2 Zeilen hat und 100 % dieser Zeilen dieselbe „book_id“ haben. Es heißt übrigens Kardinalität. Wie man Tabellenscans vermeidet (MySQL-Handbuch)

Versuchen Sie, es mit mehr Zeilen zu füllen, und Sie sollten sehen, dass MySQL einen Index für den Join verwendet.

Bearbeiten:die Abfrage

SELECT sale_amount, price
FROM books, book_sales
FORCE INDEX ( book_id ) 
WHERE book_sales.book_id = books.book_id
AND books.author_id =1

...funktioniert in diesem Fall auch nicht, da der Optimierer immer noch erkennt, dass das Lesen des Index suboptimal ist, und die Tabellenreihenfolge ändert, um dies zu vermeiden. Sie können die Tabellenreihenfolge erzwingen, indem Sie STRAIGHT_JOIN verwenden . Dies ist jedoch ein kleiner Hack, weil es MySQL dazu zwingt, die Abfrage auf eine Weise auszuführen, die nicht die beste ist.

      EXPLAIN
       SELECT sale_amount, price
         FROM books
STRAIGHT_JOIN book_sales FORCE INDEX (book_id) ON book_sales.book_id = books.book_id
        WHERE books.author_id = 1