web-dev-qa-db-ja.com

MySQLのカーディナリティとは何ですか?

MySQLのカーディナリティとは何ですか?シンプルで非技術的な言語で説明してください。

テーブルのインデックス詳細にフィールドのカーディナリティが表示される場合、group_id 11の場合、それはどういう意味ですか?

101
OM The Eternity

最大カーディナリティ:すべての値は一意です

最小カーディナリティー:すべての値は同じです

一部の列は、各行に同じ値を入力することを禁止する制約(一意など)が設定されているため、高カーディナリティ列と呼ばれます。

カーディナリティは、データのクラスター化、並べ替え、検索の機能に影響するプロパティです。したがって、DBのクエリプランナーにとって重要な測定であり、最適なプランを選択するために使用できるヒューリスティックです。

115

ウィキペディアは SQLのカーディナリティ を次のように要約しています。

[〜#〜] sql [〜#〜] (Structured Query Language)では、用語cardinalityは- 一意 の特定の列(属性)に含まれるデータ値 データベーステーブル 。カーディナリティが低いほど、列内の要素が重複します。したがって、カーディナリティが可能な限り低い列は、すべての行で同じ値になります。 SQLデータベースはカーディナリティを使用して、特定のクエリの最適な クエリプラン を決定します。

32
Kami

インデックス内の一意の値の数の推定値です。

主キー列が1つしかないテーブルの場合、通常、カーディナリティはテーブル内の行数と等しくなければなりません。

詳細

24
Rhapsody

基本的に、KamiがリンクしているWikipediaの記事によると、列の値の一意性の程度に関連付けられています。

考慮することが重要な理由は、インデックス作成戦略に影響するためです。インデックスは使用するのに十分な選択性がないため、2つの可能な値のみで低カーディナリティ列をインデックス化するポイントはほとんどありません。

15
Martin Smith

カーディナリティが高いほど、行の差別化が向上します。差別化は、より少ないブランチをナビゲートしてデータを取得するのに役立ちます。

したがって、より高いコード値は次を意味します。

  • 読み取りクエリのパフォーマンスの向上。
  • より大きなデータベースサイズ。
  • 非表示のインデックスデータが更新されるため、書き込みクエリのパフォーマンスが低下します。
10
Zon

数学用語では、カーディナリティは値のセット内の値のカウントです。セットには、一意の値のみを含めることができます。例は、セット「A」です。

セット「A」をA = {1,2,3}とします-そのセットのカーディナリティは| 3 |です。

セット「A」に5つの値A = {10,21,33,42,57}が含まれている場合、カーディナリティーは| 5 |です。

Mysqlのコンテキストでそれが意味することは、テーブル列のカーディナリティがその列の一意の値のカウントであることです。主キー列のカーディナリティ(例:table.id)を見ると、テーブルの各行に1つの一意のIDがあるため、その列のカーディナリティはそのテーブルに含まれる行数を示します。そのテーブルで "COUNT(*)"を実行して、テーブルの行数を調べる必要はありません。単純にカーディナリティを調べます。

7
user3112246

簡単な方法では、カーディナリティーは、テーブル内の行またはタプルの数です。列数は「度」と呼ばれます

4
Aayush

manual から:

カーディナリティ

インデックス内の一意の値の数の推定。これは、ANALYZE TABLEまたはmyisamchk -aを実行することにより更新されます。カーディナリティは整数として保存された統計に基づいてカウントされるため、小さなテーブルであっても値は必ずしも正確ではありません。カーディナリティが高いほど、結合を行うときにMySQLがインデックスを使用する可能性が高くなります。

Perconaからの分析

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)
4
Junjie Li