1

私がテーブルを持っているとしましょうevents {id, userid, create_time, country, type, page, browser}

すべての列にインデックスがあります。クエリを実行すると

select count(*) from events where id > ? and id < ? and userid>? and userid<? and create_time>? and create_time<? and browser=? and country=? and page=?

次の質問があります。

  1. すべてのインデックスが使用されますか?そうでない場合は、それを達成する方法。
  2. 複数の列のインデックスを持つ方が良いでしょうか?
  3. (id、userid、page)に複数の列のインデックスがある場合、それは使用されますか?もしそうなら、他のインデックスも使用されますか?
  4. すべての列を含む複数の列のインデックスがあるが、クエリにすべての列が含まれていない場合、そのインデックスが使用されますか?
4

2 に答える 2

1

すべてのインデックスが使用されますか?

いいえ。使用されるインデックスは1つだけです。これは、EXPLAINの出力で確認できます。

複数の列のインデックスを持つ方が良いでしょうか?

等式制約がある場合は、はい。しかし、それはあなたのクエリには当てはまらないようです。カバーするインデックス(クエリに必要なすべての値を含むインデックス)があると便利です。

(id、userid、page)に複数の列のインデックスがある場合、それは使用されますか?

create_timeおそらく、しかしそれがカバーするインデックスになるので、追加することをお勧めします。pageクエリでは使用されないため、インデックスには必要ありません。

すべての列を含む複数の列のインデックスがあるが、クエリにすべての列が含まれていない場合、そのインデックスが使用されますか?

列の順序によって異なります。クエリでインデックスを使用する場合は、代わりにcreate_timeインデックスを使用できます(create_time, country)。しかし、上のインデックスは(country, create_time)役に立ちません。

于 2012-06-28T22:59:31.030 に答える
0

Q:すべてのインデックスが使用されますか?

A:ほとんどありません。MySQLは、選択性が最も高い(最も多くの行を削除する)単一のインデックスを選択し、インデックス参照からデータページにアクセスする可能性が高くなります。

MySQLがインデックスマージ操作を実行する可能性はありますが、それはまれな例外です。それが起こっているかどうかを確認するために本当に行う必要があり、EXPLAINMySQLがそれを最適な計画と見なすケースを開発するためにいくつかの作業を行う必要があります。(誰かがその仕事をした可能性があり、そのようなテストケースを持っています。)

Q:そうでない場合、それを達成する方法。

A:あなたはそれを達成したくありません。MySQLに実行させたいのは、最適な計画を生成することです。インデックスマージプランは、クエリに最適なプランではない可能性があります。このような操作では、MySQLがこれらのすべてのインデックスを「一致」させる必要があり、これを行うのは大変な作業です。

Q:複数の列のインデックスがある方が良いでしょうか?

A:はい。特定のクエリに最適なインデックスは、クエリで参照されているすべての列を含むカバーインデックスです。通常、最も選択性が高く、カーディナリティが最も高いカラムが最初に必要になります。クエリは等価性テストではなく範囲スキャンを実行しているように見えます。最初にインデックスの列の値のセット全体と比較して、述語の値の範囲が最も狭い列が必要です。

Q:(id、userid、page)に複数の列のインデックスがある場合、それは使用されますか?

A:おそらく。そのインデックスの先頭の2つの列に範囲スキャン述語があるため、間違いなく候補のように見えます。これらがクエリで参照される唯一の列である場合、インデックスが使用される可能性がはるかに高くなります。

クエリテキストにcreate_timeへの不正な参照があるようです。その列にある種の述語を含めるつもりだったようです。その場合は(id, userid, create_time)、データページを参照せずにインデックスからクエリを満たすことができるため、インデックスonがより適切な候補になります。

一方、データページのフルスキャンがより最適な計画である可能性があります。

Q:その場合、他のインデックスも使用されますか?

A:ほとんどありません。MySQLがテーブルで「複数の」インデックスを使用するという考えは、MySQLがインデックスをどのように使用するかについての一般的な誤解です。それは問題外ではありませんが、INDEXMERGE操作が最適な計画である可能性はほとんどありません。

Q:すべての列を含む複数の列のインデックスがありますが、クエリにすべての列が含まれていない場合、そのインデックスが使用されますか?

A:可能です。MySQLがそのインデックスの使用が最適な計画であると判断した場合、それが使用されます。使用される可能性が高いインデックス(使用可能な場合)は、クエリで参照されている列のみを含むカバーインデックスです。

于 2012-06-28T23:54:42.573 に答える