Jak widać w wyjaśnieniu, „book_id” jest wymieniony jako możliwy klucz. Jeśli MySQL z niego nie korzysta, oznacza to, że optymalizator nie sądzi, że przyspieszyłoby to zapytanie. Co jest prawdą, jeśli „book_sales” ma tylko 2 wiersze, a 100% tych wierszy ma ten sam „book_id”. To się nazywa kardynalność btw. Jak uniknąć skanowania tabel (Podręcznik MySQL)
Spróbuj wypełnić go większą liczbą wierszy, a powinieneś zobaczyć, że MySQL użyje indeksu do łączenia.
Edycja:zapytanie
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
... w takim przypadku również nie zadziała, ponieważ optymalizator nadal rozpoznaje, że odczyt indeksu jest nieoptymalny i zmienia kolejność tabel, aby tego uniknąć. Możesz wymusić kolejność tabel, używając STRAIGHT_JOIN . Jest to jednak trochę hack, ponieważ zmusza MySQL do wykonania zapytania w sposób, który nie jest najlepszy.
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