たとえば、と列を持つテーブルがあるcity
場合state
、インデックスを使用するための最良の方法は何ですか?
明らかcity
にカーディナリティが最も高くなるので、その列をインデックスの最初に配置する必要がありますか、状態を配置する必要がありますか、それともそれほど重要ではありませんか?
たとえば、と列を持つテーブルがあるcity
場合state
、インデックスを使用するための最良の方法は何ですか?
明らかcity
にカーディナリティが最も高くなるので、その列をインデックスの最初に配置する必要がありますか、状態を配置する必要がありますか、それともそれほど重要ではありませんか?
MySQL複合インデックスのルックアップは、インデックス内で列が定義されている順序で実行する必要があります。MySQLで可能な限り少ない比較を実行してレコードを区別できるようにしたいので、他のすべての条件が同じであれば、列がカーディナリティの高いものから低いものの順に並べられた複合インデックスから最も恩恵を受けることができます。
つまり、レコードを区別するために最終的に最高カーディナリティ列に対して比較を実行する必要があると仮定すると、最終的に不要になる可能性があるのに、なぜ最低カーディナリティ列に対して最初に比較を強制するのでしょうか。
この場合は問題ではありません:
INDEX cs (city, state),
INDEX sc (state, city)
WHERE city = 'Atlanta'
AND state = 'Georgia'
どちらのインデックスでも、BTreeでのドリルダウンは同じ作業であり、同じように1つの行にすばやく到達できます。
(の句の順序は重要でWHERE
はありません。)
(テストの代わりに「範囲」テストを使用している場合は=
、それは別の質問です。)