Q:すべてのインデックスが使用されますか?
A:ほとんどありません。MySQLは、選択性が最も高い(最も多くの行を削除する)単一のインデックスを選択し、インデックス参照からデータページにアクセスする可能性が高くなります。
MySQLがインデックスマージ操作を実行する可能性はありますが、それはまれな例外です。それが起こっているかどうかを確認するために本当に行う必要があり、EXPLAIN
MySQLがそれを最適な計画と見なすケースを開発するためにいくつかの作業を行う必要があります。(誰かがその仕事をした可能性があり、そのようなテストケースを持っています。)
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がそのインデックスの使用が最適な計画であると判断した場合、それが使用されます。使用される可能性が高いインデックス(使用可能な場合)は、クエリで参照されている列のみを含むカバーインデックスです。