MySQLのカーディナリティとは?意味と種類、UNIQUE制約を使った実例をわかりやすく解説
MySQLにおける「カーディナリティ(Cardinality)」とは、カラム(列)に格納されるデータ値の一意性(ユニークさ)の度合いを表す概念です。この性質は、データの検索・クラスタリング・ソートの効率に大きな影響を与えます。
また、MySQLではインデックスの統計情報としてもカーディナリティが利用されており、オプティマイザが実行計画を立てる際の判断材料になります。そのため、カーディナリティの理解はパフォーマンスチューニングの観点からも重要です。
カーディナリティの2つの種類
カーディナリティは、その値の分布によって主に次の2種類に分類されます。
- 低カーディナリティ(Low Cardinality):カラム内の値がほぼ同じで、重複が多い状態。
- 高カーディナリティ(High Cardinality):カラム内のすべての値が一意(ユニーク)である状態。
例えば「性別」や「都道府県」のような選択肢が限られたカラムは低カーディナリティに、「メールアドレス」や「ユーザーID」のように重複が許されないカラムは高カーディナリティに該当します。
カラムにUNIQUE制約などを付けて重複値を禁止したい場合には、高カーディナリティの考え方が活用されます。
高カーディナリティの例
以下は高カーディナリティの例です。UNIQUE制約により、カラムのすべての値が一意であることが保証されます。
mysql> create table UniqueDemo1 -> ( -> id int, -> name varchar(100), -> UNIQUE(id,name) -> ); Query OK, 0 rows affected (0.81 sec)
続いて、テーブルにレコードを挿入してみます。
mysql> insert into UniqueDemo1 values(1,'John'); Query OK, 1 row affected (0.18 sec) mysql> insert into UniqueDemo1 values(1,'John'); ERROR 1062 (23000): Duplicate entry '1-John' for key 'id'
上記のように、同じレコードを再度挿入しようとするとエラーが発生します。これはUNIQUE制約によって重複が許されていないためです。
テーブル内の全レコードを表示して確認してみましょう。
mysql> select * from UniqueDemo1;
以下が出力結果です。重複する値に対してはエラーが表示されるため、テーブルには先ほど追加した1件のレコードのみが存在しています。
+------+------+ | id | name | +------+------+ | 1 | John | +------+------+ 1 row in set (0.00 sec)
低カーディナリティの例
次に、低カーディナリティの例を見てみましょう。
まずテーブルを作成します。
mysql> create table LowCardinality -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.71 sec)
ここではUNIQUE制約を付けていないため、重複した値を持つレコードを挿入できます。
mysql> insert into LowCardinality values(1,'John'); Query OK, 1 row affected (0.19 sec) mysql> insert into LowCardinality values(1,'John'); Query OK, 1 row affected (0.14 sec)
全レコードを表示してみます。
mysql> select * from LowCardinality;
出力結果を見ると、まったく同じ内容のレコードが2件登録されていることがわかります。これはテーブル作成時にUNIQUE制約を指定しなかったため、重複値がそのまま許容された結果です。
+------+------+ | id | name | +------+------+ | 1 | John | | 1 | John | +------+------+ 2 rows in set (0.00 sec)
まとめ
カーディナリティとは、カラムに格納される値の一意性の度合いを指し、高カーディナリティであれば値がほぼ一意、低カーディナリティであれば重複が多いことを意味します。UNIQUE制約を活用すれば重複を防げる一方、カーディナリティの高いカラムにインデックスを作成すると検索効率が向上しやすいなど、データベース設計やクエリ最適化において重要な指標となります。
-
MySQLでBETWEEN句を使わずに範囲内の値を取得する方法:AND演算子による代替手段
BETWEEN句の代替としてAND演算子を使用する MySQLでは、特定の範囲内の値を取得する際に一般的にBETWEEN句が使われますが、実はAND演算子を組み合わせた比較条件でも同じ結果を得ることができます。この記事では、BETWEEN句を使わずに範囲検索を行う具体的な手順を解説します。 1. サンプルテーブルを作成する まず、数値を格納するためのシンプルなテーブルを作成しましょう。 mysql> create table DemoTable ( Number int ); Query OK, 0 rows affected (0.62 sec) 2. テストデータを挿入す
-
MySQLでテーブルの値からランダムに2件のレコードを取得する方法
MySQLでランダムにレコードを抽出するには、ORDER BY RAND()を使用します。さらに、取得する件数を2件に限定したい場合は、LIMIT 2を組み合わせることで実現できます。この記事では、実際にテーブルを作成し、ランダムに2つの値を取得する手順を具体的な例とともに解説します。サンプルテーブルの作成まず、質問文を格納するテーブルを作成しましょう。mysql> create table DemoTable1815 ( Question text ); Query OK, 0 rows affected (0.00 sec)テストデータの挿入次に、INSERT