2017-04-22 9 views
2

私は、IN、そして予期せぬ何かを見つけ、mysqlの `select where`クエリの仕組みは?なぜより大きい量のパラメタがより速い?

  1. SELECT a,b,c FROM tbl1 where a IN (a1,a2,a3...,a5000)は、SELECTでのクエリをやっている - >このクエリは6.4ms

何をした - >このクエリは

  • SELECT a,b,c FROM tbl1 where a IN (a1,a2,a3...,a20)はは1.7msを取りましたINのアルゴリズムですか?なぜより小さなパラメータよりもパラメータの方が速いのですか?

  • 答えて

    0

    次は...すべてのSQLクエリの

    推測です、オプティマイザは、使用するインデックスを選択するクエリを分析します。

    複数の範囲のクエリ(IN(...)など)の場合、オプティマイザは、ショートリストの各値に対して「インデックスダイブ」を実行し、インデックスを使用することをお勧めします。あまりにも一般的な値を検索する場合は、テーブルスキャンを行うほうが効率的です。そのため、インデックスを使用する必要はありません。

    MySQL 5.6では、長いリストを使用するとインデックスダイブをスキップするための特別な最適化機能が導入されました。代わりに、a列のインデックスは、格納されたインデックス統計に基づいて使用する価値があると推測します。

    eq_range_index_dive_limitオプションを使用して、インデックスのオプティマイザがインデックスダイブをスキップする時間を制御することができます。デフォルトは10です。この例では長さ20のリストが表示されています。なぜ高価なのかわかりません。

    ここでこの機能に関するマニュアルを読む:https://dev.mysql.com/doc/refman/5.7/en/range-optimization.html#equality-range-optimization

    関連する問題