MySQLのカーディナリティとは何ですか?シンプルで非技術的な言語で説明してください。
テーブルのインデックス詳細にフィールドのカーディナリティが表示される場合、group_id
11の場合、それはどういう意味ですか?
最大カーディナリティ:すべての値は一意です
最小カーディナリティー:すべての値は同じです
一部の列は、各行に同じ値を入力することを禁止する制約(一意など)が設定されているため、高カーディナリティ列と呼ばれます。
カーディナリティは、データのクラスター化、並べ替え、検索の機能に影響するプロパティです。したがって、DBのクエリプランナーにとって重要な測定であり、最適なプランを選択するために使用できるヒューリスティックです。
ウィキペディアは SQLのカーディナリティ を次のように要約しています。
[〜#〜] sql [〜#〜] (Structured Query Language)では、用語cardinalityは- 一意 の特定の列(属性)に含まれるデータ値 データベーステーブル 。カーディナリティが低いほど、列内の要素が重複します。したがって、カーディナリティが可能な限り低い列は、すべての行で同じ値になります。 SQLデータベースはカーディナリティを使用して、特定のクエリの最適な クエリプラン を決定します。
基本的に、KamiがリンクしているWikipediaの記事によると、列の値の一意性の程度に関連付けられています。
考慮することが重要な理由は、インデックス作成戦略に影響するためです。インデックスは使用するのに十分な選択性がないため、2つの可能な値のみで低カーディナリティ列をインデックス化するポイントはほとんどありません。
カーディナリティが高いほど、行の差別化が向上します。差別化は、より少ないブランチをナビゲートしてデータを取得するのに役立ちます。
したがって、より高いコード値は次を意味します。
数学用語では、カーディナリティは値のセット内の値のカウントです。セットには、一意の値のみを含めることができます。例は、セット「A」です。
セット「A」をA = {1,2,3}とします-そのセットのカーディナリティは| 3 |です。
セット「A」に5つの値A = {10,21,33,42,57}が含まれている場合、カーディナリティーは| 5 |です。
Mysqlのコンテキストでそれが意味することは、テーブル列のカーディナリティがその列の一意の値のカウントであることです。主キー列のカーディナリティ(例:table.id)を見ると、テーブルの各行に1つの一意のIDがあるため、その列のカーディナリティはそのテーブルに含まれる行数を示します。そのテーブルで "COUNT(*)"を実行して、テーブルの行数を調べる必要はありません。単純にカーディナリティを調べます。
簡単な方法では、カーディナリティーは、テーブル内の行またはタプルの数です。列数は「度」と呼ばれます
manual から:
カーディナリティ
インデックス内の一意の値の数の推定。これは、ANALYZE TABLEまたはmyisamchk -aを実行することにより更新されます。カーディナリティは整数として保存された統計に基づいてカウントされるため、小さなテーブルであっても値は必ずしも正確ではありません。カーディナリティが高いほど、結合を行うときにMySQLがインデックスを使用する可能性が高くなります。
CREATE TABLE `antest` (
`i` int(10) unsigned NOT NULL,
`c` char(80) default NULL,
KEY `i` (`i`),
KEY `c` (`c`,`i`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
mysql> select count(distinct c) from antest;
+-------------------+
| count(distinct c) |
+-------------------+
| 101 |
+-------------------+
1 row in set (0.36 sec)
mysql> select count(distinct i) from antest;
+-------------------+
| count(distinct i) |
+-------------------+
| 101 |
+-------------------+
1 row in set (0.20 sec)
mysql> select count(distinct i,c) from antest;
+---------------------+
| count(distinct i,c) |
+---------------------+
| 10201 |
+---------------------+
1 row in set (0.43 sec)
mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest | 1 | i | 1 | i | A | NULL | NULL | NULL | | BTREE | |
| antest | 1 | c | 1 | c | A | NULL | NULL | NULL | YES | BTREE | |
| antest | 1 | c | 2 | i | A | NULL | NULL | NULL | | BTREE | |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.00 sec)
mysql> analyze table sys_users;
+--------------------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------------------------+---------+----------+----------+
| antest | analyze | status | OK |
+--------------------------------+---------+----------+----------+
1 row in set (0.01 sec)
mysql> show index from antest;
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| antest | 1 | i | 1 | i | A | 101 | NULL | NULL | | BTREE | |
| antest | 1 | c | 1 | c | A | 101 | NULL | NULL | YES | BTREE | |
| antest | 1 | c | 2 | i | A | 10240 | NULL | NULL | | BTREE | |
+--------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
3 rows in set (0.01 sec)