Zoals je kunt zien in de EXPLAIN, wordt "book_id" vermeld als een mogelijke sleutel. Als MySQL het niet gebruikt, denkt de optimizer alleen dat het de zoekopdracht niet zou versnellen. Wat waar is als "book_sales" slechts 2 rijen heeft en 100% van die rijen dezelfde "book_id" delen. Het heet kardinaliteit btw. Tabelscans vermijden (MySQL-handleiding)
Probeer het te vullen met meer rijen en je zou moeten zien dat MySQL een index zal gebruiken voor de join.
Bewerken:de vraag
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
... zal in dat geval ook niet werken omdat de optimizer nog steeds herkent dat het lezen van de index suboptimaal is en de tabelvolgorde verandert om dit te voorkomen. U kunt de tafelvolgorde forceren door STRAIGHT_JOIN te gebruiken . Dit is echter een beetje een hack omdat het MySQL dwingt om de query uit te voeren op een manier die niet de beste is.
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