次の場合、インデックスはカーディナリティの低いフィールドでも役立ちます。
-
可能な値の1つが他の値と比較して非常にまれであり、それを検索する場合。
たとえば、色盲の女性は非常に少ないので、このクエリ:
SELECT * FROM color_blind_people WHERE gender = 'F'
おそらく
gender
のインデックスから恩恵を受けるでしょう 。 -
値がテーブル順にグループ化される傾向がある場合:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 1
3
しかありませんが ここでは明確な年であり、おそらく最初に古い年のレコードが追加されるため、最初の2010
を返す前に非常に多くのレコードをスキャンする必要があります。 インデックス用でない場合は記録します。 -
ORDER BY / LIMIT
が必要な場合 :SELECT * FROM people ORDER BY gender, id LIMIT 1
インデックスがない場合、
filesort
必要になります。多少最適化されていますが、LIMIT
を実行してください 、それでも全表スキャンが必要です。 -
インデックスがクエリで使用されるすべてのフィールドをカバーする場合:
CREATE INDEX (low_cardinality_record, value) SELECT SUM(value) FROM mytable WHERE low_cardinality_record = 3
-
DISTINCT
が必要な場合 :SELECT DISTINCT color FROM tshirts
MySQL
INDEX FOR GROUP-BY
を使用します 、色が少ない場合、このクエリは数百万のレコードがあっても即座に実行されます。これは、カーディナリティの低いフィールドのインデックスが moreであるシナリオの例です。 カーディナリティの高いフィールドよりも効率的です。
DML
の場合は注意してください パフォーマンスはそれほど問題ではないので、インデックスを作成しても安全です。
オプティマイザーがインデックスが非効率的であると判断した場合、インデックスは使用されません。