Som du kan se i EXPLAIN, er "book_id" angivet som en mulig nøgle. Hvis MySQL ikke bruger det, er det bare, at optimizeren ikke mener, at det ville fremskynde forespørgslen. Hvilket er sandt, hvis "book_sales" kun har 2 rækker, og 100% af disse rækker deler det samme "book_id". Det kaldes kardinalitet btw. Sådan undgår du tabelscanninger a> (MySQL-manual)
Prøv at udfylde den med flere rækker, og du skulle se, at MySQL vil bruge et indeks til joinforbindelsen.
Rediger:forespørgslen
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
...virker heller ikke i det tilfælde, fordi optimizeren stadig genkender, at læsning af indekset er suboptimal og skifter tabelrækkefølgen for at undgå at gøre det. Du kan gennemtvinge bordrækkefølgen ved at bruge STRAIGHT_JOIN . Dette er dog lidt af et hack, fordi det tvinger MySQL til at udføre forespørgslen på en måde, der ikke er den bedste.
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