カーディナリティとは
テーブルにカラムがあるとして、カラムに格納されているデータの種類がどのくらいあるのか(カラムの値の種類の絶対値)を、カーディナリティという。
具体例
カーディナリティが低い場合
例えば性別なら、男と女の二種類である。
カラムのデータの種類が、テーブルのレコード数に比べて二種類と少ない。このことを カーディナリティが低い という。
カーディナリティが高い場合
一方顧客番号ならたくさんの種類(番号)が存在することになる。
カラムのデータの種類が、テーブルのレコード数に比べて多い場合、 カーディナリティが高い という。
カーディナリティを踏まえたインデックスの張り方
基本的に、 カーディナリティの高い列に作成する 必要がある。
はじめに、カーディナリティは カラムの値の種類の絶対値と書いたが、先程の例で言うと性別のカーディナリティは2になる。他にも例えば1年間の日付なら1〜365なのでカーディナリティは365になる。カーディナリティが高いのは日付ということになる。
インデックスを作る時の目安は特定のカラム値を指定した時に、全体の 5%程度に絞り込めるだけのカーディナリティがあることである。例えば先ほどの日付の例だと、365日のうちの1日を指定するselect文を考えるとする。
この場合 1 / 365 ≒ 0.27%となるので、インデックスを作成する意味はあるといえるだろう。
反対に、性別の場合男女どちらを選んでも 1 / 2 = 50%となるので、インデックスを作成する意味はないし、むしろマイナスになるだろう。
複合インデックスを貼る時は、 カーディナリティの高い順に貼っていくのが大事で、適当な順番にしてはいけない。これは直感的にも顧客番号のほうが明らかに検索する回数が多そうだから先に絞ってしまおうという考えになるだろう。