次の場合、インデックスはカーディナリティの低いフィールドでも役立ちます。
-
可能な値の1つが他の値と比較して非常にまれであり、それを検索する場合。
たとえば、色盲の女性は非常に少ないので、このクエリ:
SELECT * FROM color_blind_people WHERE gender = 'F'おそらく
genderのインデックスから恩恵を受けるでしょう 。 -
値がテーブル順にグループ化される傾向がある場合:
SELECT * FROM records_from_2008 WHERE year = 2010 LIMIT 13しかありませんが ここでは明確な年であり、おそらく最初に古い年のレコードが追加されるため、最初の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 tshirtsMySQLINDEX FOR GROUP-BYを使用します 、色が少ない場合、このクエリは数百万のレコードがあっても即座に実行されます。これは、カーディナリティの低いフィールドのインデックスが moreであるシナリオの例です。 カーディナリティの高いフィールドよりも効率的です。
DMLの場合は注意してください パフォーマンスはそれほど問題ではないので、インデックスを作成しても安全です。
オプティマイザーがインデックスが非効率的であると判断した場合、インデックスは使用されません。