LoginSignup
8
0

More than 1 year has passed since last update.

カーディナリティとは何か調べてみた

Last updated at Posted at 2022-12-30

調べてみた背景

最近、MySQLを顧客向けにご提供させて頂く機会があり、レスポンスを意識したチューニングをしなければならない機会がありました。データベースのデータは、商用利用のため、膨大でした。そのため、待機時間を減らす必要性があるという課題に直面しました。

待機時間を減らすための手法の一つに、「インデックスをはる」というものがございます。 

ALTER TABLE テーブル名 ADD INDEX インデックス名(カラム名);

ただ、「インデックスをはる」にあたり、考慮しなくてはならない概念がございます。

カーディナリティ

カーディナリティは、データベースの列(カラム)に入っているデータの種類の事を指す。
異なる値の数(バリエーション)がどれぐらい存在しているかを表す。 基数あるいは濃度という意味。
カーディナリティは カラムの値の種類の絶対値である。

【カーディナリティとインデックスの関係についての考察】
結論:カーディナリティが高い列にインデックスを作成する必要がある。
理由:バリエーションが多いので、分類しないと、見分けるのが大変であるため。
・カーディナリティが低い列にインデックスを作成する意味はない。
インデックスを作成する方が、検索速度が、遅くなる。個別に確認した方が、検索速度が向上する。

野菜(ごぼう)を調べる事を例にして表現する
image.png

購入者性別の列で、分類した結果
バリエーションが少ないので、カーディナリティが低い。

男がごぼうを購入するとは限らず、女がごぼうを買うかもしれない。
男か女かを確認した後で、野菜(ごぼう)を調べるのは、効率が悪い。
分類せずとも、野菜(ごぼう)を調べる時、野菜(ごぼう)を個別に見れば済む。
image.png

Vegetable野菜の種類で、分類した結果
バリエーションが多いので、カーディナリティが高い。

野菜(ごぼう)を調べる時、野菜(ごぼう)を個別に見れば済む。
分類したうえで、項目別に確認したほうがわかりやすい。

ごぼうを調べる時、一旦、根菜類で分類し、項目別に表示する。(余計な情報を削除出来る。)
image.png

カーディナリティが高い列にインデックスを作成すると、
項目を整理する事が出来るので、検索速度が向上する。

8
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
0