2012-08-31 4 views
29

複数の列を持つテーブル(たとえば、id, a, b, c, d, e)を想像してください。私は通常idで選択しますが、列のサブセットを超えてさまざまな条件を使用するクライアントアプリケーションに複数のクエリがあります。MySQLは単一のクエリに対して複数のインデックスを使用できますか?

MySQLが複数のWHERE条件を持つ単一のテーブルに対して複数の列でクエリを実行すると、実際には異なる列で作成されたインデックスを使用できますか?または、それを高速化する唯一の方法は、すべての可能なクエリに対して複数列のインデックスを作成することです。

+0

お問い合わせの例がありますか? – ZombieCode

+6

@Ekaterina、привет:)質問には、練習と経験に訴える一般的な質問が含まれていますが、ここで具体的な質問は必要ありません。しかし、それが意味をなさない場合、私は事例を考えることができます – kolypto

答えて

47

はい、MySQLでは、単一のクエリに対して複数のインデックスを使用できます。オプティマイザは、どのインデックスがクエリに役立つかを判断します。 EXPLAINを使用して、MySQLのステートメントの実行方法に関する情報を取得できます。あなたはそのようなヒントを使用してインデックスを追加したり、無視することができます。

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a; 

私はhow MySQL uses indexes上に読んでお勧めします。

ちょうど少数の抜粋:

複数のインデックス間の選択がある場合、MySQLは通常、行の最小数を見つける インデックスを使用しています。

複数の列のインデックスがcol1とcol2に存在する場合、適切な の行を直接フェッチできます。個別の単一列索引がcol1とcol2にある に存在する場合、オプティマイザは、索引マージ の最適化を使用します(第8.3.1.4項「索引マージの最適化」を参照)。または、 は、インデックス は、より少ない行を見つけ、そのインデックスを使用して行をフェッチします。

+2

うわー、それは新しいものか、私はその文書でそれを見逃すことができました。ありがとうございます、それは面白いです:)とにかく、特定のケースのマルチカラムインデックスは、はるかに優れたパフォーマンスが必要です。 – kolypto

15

古典的に、MySQLでは、特定のクエリでテーブル参照ごとに1つのインデックスを使用できます。しかし、最近のバージョンのMySQLでは、index mergeという操作が実行され、MySQLはテーブルごとに複数のインデックスを使用できます。

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

+3

私はそれを編集すべきだと思います:* "テーブルごとに1つのインデックス**を使用できます**参照**" –

関連する問題