調べてみた背景
最近、MySQLを顧客向けにご提供させて頂く機会があり、レスポンスを意識したチューニングをしなければならない機会がありました。データベースのデータは、商用利用のため、膨大でした。そのため、待機時間を減らす必要性があるという課題に直面しました。
待機時間を減らすための手法の一つに、「インデックスをはる」というものがございます。
ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);
ただ、「インデックスをはる」にあたり、考慮しなくてはならない概念がございます。
カーディナリティ
カーディナリティは、データベースの列(カラム)に入っているデータの種類の事を指す。
異なる値の数(バリエーション)がどれぐらい存在しているかを表す。 基数あるいは濃度という意味。
カーディナリティは カラムの値の種類の絶対値である。
【カーディナリティとインデックスの関係についての考察】
結論:カーディナリティが高い列にインデックスを作成する必要がある。
理由:バリエーションが多いので、分類しないと、見分けるのが大変であるため。
・カーディナリティが低い列にインデックスを作成する意味はない。
インデックスを作成する方が、検索速度が、遅くなる。個別に確認した方が、検索速度が向上する。
購入者性別の列で、分類した結果
バリエーションが少ないので、カーディナリティが低い。
男がごぼうを購入するとは限らず、女がごぼうを買うかもしれない。
男か女かを確認した後で、野菜(ごぼう)を調べるのは、効率が悪い。
分類せずとも、野菜(ごぼう)を調べる時、野菜(ごぼう)を個別に見れば済む。
Vegetable野菜の種類で、分類した結果
バリエーションが多いので、カーディナリティが高い。
野菜(ごぼう)を調べる時、野菜(ごぼう)を個別に見れば済む。
分類したうえで、項目別に確認したほうがわかりやすい。
ごぼうを調べる時、一旦、根菜類で分類し、項目別に表示する。(余計な情報を削除出来る。)
カーディナリティが高い列にインデックスを作成すると、
項目を整理する事が出来るので、検索速度が向上する。