詳細については、以下のリンクを参照してください
https://dev.mysql.com/doc /refman/8.0/en/table-scan-avoidance.html
全表スキャンの原因は以下のとおりです
-
テーブルは非常に小さいため、キールックアップを気にするよりもテーブルスキャンを実行する方が高速です。これは、行が10行未満で、行の長さが短いテーブルで一般的です。
-
インデックス付き列のON句またはWHERE句に使用可能な制限はありません。
-
インデックス付きの列を定数値と比較していて、MySQLは(インデックスツリーに基づいて)定数がテーブルの非常に大きな部分をカバーし、テーブルスキャンが高速になると計算しました
-
別の列でカーディナリティの低いキー(多くの行がキー値と一致する)を使用しています。この場合、MySQLは、キーを使用することで多くのキールックアップを実行し、テーブルスキャンが高速になると想定しています。
以下の全表スキャンの使用を避けるために:
-
ANALYZE TABLE tbl_nameを使用して、スキャンされたテーブルのキー分布を更新します。
-
スキャンされたテーブルにFORCEINDEXを使用して、指定されたインデックスを使用する場合に比べてテーブルスキャンのコストが非常に高いことをMySQLに通知します。
例えばSELECT * FROM t1、t2 FORCE INDEX(index_for_column)WHERE t1.col_name =t2.col_name;