sql >> データベース >  >> RDS >> Mysql

MySQLクエリはテーブル結合でインデックスを使用しません

    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
    


    1. MySQLDBの1秒あたりのInnoDB書き込みの速度を向上させる方法

    2. MySQL JDBCドライバー接続文字列とは何ですか?

    3. Mysql:2つの列の間で値を選択する

    4. MySQLDECIMALデータ型