2012-01-15 15 views
2

私はそうように構成されたインデックスを持つ:MySQLとインデックス

BTREE merchant_id 
BTREE flag 

BTREE test (merchant_id, flag) 

私は、次のようなSELECTクエリを実行します。良いだろう

SELECT badge_id, merchant_id, badge_title, badge_class 
FROM badges WHERE merchant_id = 1 AND flag = 1 

何指数?彼らが別々のインデックスに入っているかどうかは重要ですか?

+0

興味深い質問。一般的に、私はmerchant_id-indexをテストインデックスの左端に追加するのを避けています。しかし、それが本当に選択のために速ければ私は知らない。しかし、索引を追加すると、すべての挿入にコストがかかりますので、2つの索引を追加するほうが良いと思います。私は複数の列を持つ二次索引がどのように機能するのか理解できませんでした。私はある人に答えがあることを願っています。 –

+0

他のすべてが失敗した場合は、それをベンチマークしてください:) –

答えて

2

「どの列が索引付けに適していますか」、「問合せプランナは特定の索引を使用して問合せを実行していますか?」などの質問に答えるには、EXPLAIN statementを使用できます。クエリとスキーマを最適化する際のEXPLAINの使用方法の包括的な概要については、優良記事Analyzing Queries for Speed with EXPLAINを参照してください。

一般に、いくつかの列のいずれかを索引付けすることによって問合せを最適化できる場合は、すべてのレコードに対して「最も一意」または「最も選択的」な列を索引付けすることが大切です。つまり、すべての行に対して最も多数の異なる値を持つ列を索引付けします。あなたのケースでは、merchant_id列に最も多くの一意の値が含まれていると推測しているので、おそらくインデックスに登録する必要があります。すべてのパターンのクエリでEXPLAINを使用して、インデックスの選択が最適であることを確認できます。

「最も選択的な列をインデックスする」というルールは、必ずしもコンポジット(複合またはマルチ列とも呼ばれます)インデックスの最初の列の選択には適用されません。あなたの質問に依存します。たとえば、employee_idが最も選択的な列であるが、SELECT * FROM badges WHERE flag = 17のようなクエリを実行する必要がある場合は、badgesテーブルの唯一のインデックスとして複合インデックス(employee_id, flag)を使用すると、クエリによるフルテーブルスキャンの結果が得られます。

+0

非常に有用で徹底的です。 +1 –

関連する問題