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