Както можете да видите в EXPLAIN, "book_id" е посочен като възможен ключ. Ако MySQL не го използва, просто оптимизаторът не смята, че това би ускорило заявката. Което е вярно, ако „book_sales“ има само 2 реда и 100% от тези редове споделят един и същ „book_id“. Между другото, това се нарича кардиналност. Как да избегнем сканирането на таблици (Ръководство за MySQL)
Опитайте да го попълните с повече редове и трябва да видите, че MySQL ще използва индекс за присъединяването.
Редактиране:заявката
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
... няма да работи и в този случай, защото оптимизаторът все още разпознава, че четенето на индекса е неоптимално и превключва реда на таблицата, за да избегне това. Можете да принудите реда на таблицата, като използвате STRAIGHT_JOIN . Това обаче е малко хак, защото принуждава MySQL да изпълни заявката по начин, който не е най-добрият.
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