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

MySQL Query n'utilise pas l'index dans la jointure de table

Comme vous pouvez le voir dans EXPLAIN, "book_id" est répertorié comme une clé possible. Si MySQL ne l'utilise pas, c'est simplement que l'optimiseur ne pense pas que cela accélérerait la requête. Ce qui est vrai si "book_sales" n'a que 2 lignes et que 100 % de ces lignes partagent le même "book_id". C'est ce qu'on appelle la cardinalité btw. Comment éviter les analyses de table (Manuel MySQL)

Essayez de le remplir avec plus de lignes et vous devriez voir que MySQL utilisera un index pour la jointure.

Edit :la requête

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

... ne fonctionnera pas non plus dans ce cas car l'optimiseur reconnaît toujours que la lecture de l'index est sous-optimale et change l'ordre des tables pour éviter cela. Vous pouvez forcer l'ordre des tables en utilisant STRAIGHT_JOIN . Il s'agit cependant d'un hack, car cela oblige MySQL à exécuter la requête d'une manière qui n'est pas la meilleure.

      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