2017-04-24 8 views
0

を注文するために必要なインデックス:onetwothreeSELECT * FROM table ORDER BY one, two, three LIMIT 1のようなSQLクエリは - 私は本当にすべての3つのカラムを用いたマルチカラムインデックスを作成する必要がありますか?のMySQL:複数列が3列で10+百万台を持つ

onetwoが一致すると、別のthreeの最大10行が存在することがわかります。

高速SELECTには十分ですか? -

CREATE INDEX MY_INDEX ON table (one, two);

答えて

1

INDEX(one, two, three)とすると、クエリーは、BTreeを目的の行の1つ(LIMIT 1)にまっすぐ進みます。INDEX(one, two)

、クエリが(おそらくで行われ(ORDER BYthreeを含みます)、それらを並べ替え、そしてtmpのテーブルに保存し、アップ・ツー・10行を前方にスキャンし、最初のそのような行にまっすぐB木下がるだろうメモリ)を作成し、最初のものを配信します。これはより複雑に聞こえますが、(この例では)はるかに遅くなりません。

"テーブルスキャン"( "ALL")ではなく、おそらく "範囲"スキャンです。参照するにはEXPLAIN SELECT ...を使用してください。

threeがかさばった文字列の場合、3-colインデックスは大きくなります。これはディスクスペースとパフォーマンスに多少の影響を与えます。

他のクエリには(one, two)だけが必要な場合は、のいずれかのインデックスが適切に機能します(「かさばった」コメントは除きます)。

SELECT one, two, three FROM ...を実行すると、3つの部分からなるインデックスが「カバーする」ため、より効果的です。 SELECT *にはこのようなボーナスはありません。

ボトムライン:いずれのインデックスも「OK」です。他の多くの要素が原因で、何をすべきかを確実に伝えることができません。

0

あなたは、MySQLだけにインデックスを使用して、せいぜい最初の10行を読み、これらを並べ替えてくれていると思うかもしれません。残念ながら、オプティマイザはこの時点でlimitを考慮していないため、そうではありません。 explain select ...を使用すると、MySQLがフルテーブルスキャン("ALL")を実行することがわかります。すべての未使用部分限り、ORDER BYが正確インデックスと一致しない場合であっても

指標を用いることもできる。

documentationorder by最適化するためにインデックスを使用することができるように条件を説明します索引とすべての余分なORDER BY列はWHERE句の定数です。

3番目の列がこれを満たしていません。したがって、このクエリはこのインデックスを使用しません。これは、他のものには役に立たないとは限りません。

は、MySQL 5.6以来、しかしそこにある対応するためにfilesort priority queue optimizationいわゆるlimit:MySQLはまだテーブル全体を読み込みますが、それは(時間のかかるプロセスになります)、表全体をソートしませんが、停止します最初の行が何であるかを知っているときには、クエリを受け入れやすくなります。

しかし、あなたは、あなたが考えている正確に何を行うには、クエリを書き直すことができます。これは、そのインデックスを使用して最初の10行を読み、そしてちょうどこれらをソートします

SELECT * FROM 
    (select * from table ORDER BY one, two LIMIT 10) sub 
order by one, two, three limit 1; 

。もちろん、最大で10行しか持たないことが確実であれば正しく動作します。

可能な最大行数を知ることとは別にクエリを最適化するより一般的な方法は、たとえば次のようになります。

SELECT * FROM table 
where one = (select min(one) from table) 
order by one, two, three limit 1; 

これはone(インデックスを使用して)最初で唯一のこれらの行を考慮するための最低値を調べることにより、読み、filesortedする必要がある行の数を減らすためにインデックスを使用します。同様に、twoの条件を含めることができます。

または、インデックスに3つの列をすべて使用することもできます(ただし、3番目の列のサイズにもよりますが、これを行わないと意味があります)。この種の最適化は、ある時点で追いつく傾向があります。例:最初のメソッドを使用し、2年後に11行が可能になります。コード(コード)に暗黙の条件があることを覚えておく必要があります。

+0

私は「テーブルスキャン」の主張に異議を申し立てます。 –

関連する問題