前提・発生している事象
a,b,cの3カラムがある、500万行ほどのtableがあります。
a-bに対して複合PRIMARY KEYを設定しています。a,b,cは全てvarcharです。
下記のようなSQLを実行し、explainを確認します。
select * from tbl where (a,b) in (('*', '*')) select * from tbl where (a,b) in (('*', '*'),('*', '*'),...)
in句の中が1つの場合、explainのtypeは「const」となりました。
2つ〜350こ程度までの場合、typeは「range」となりました。
351以上の場合、typeは「all」となりました。
force index (PRIMARY)を付けてみましたが、状況は変わりませんでした。
質問
・なぜin句の中が多くなるとフルスキャンになってしまうのでしょうか
・上記SQLを高速化するにはどうしたら良いですか(in句の中身は2000個程度までを想定しております)
以上、よろしくお願い致します。
補足情報(FW/ツールのバージョンなど)
MySQL 5.7.14
###追記(3/27 23:24)
みなさまご回答ありがとうございます。
一度テンポラリテーブルを作成して、joinすることで0.003sec程度で結果が返ってきました。
しかしながらPKのみで、join または inすることは、両者ともあまり変わらないような気もしますが、内部的に処理が大きく異なるのでしょうか。
なぜin句だとフルスキャンになってしまうのか、引き続き回答お待ちしております。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/03/27 12:14 編集
2018/03/27 14:37