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


106

MySQLのカーディナリティとは何ですか?技術的でない簡単な言葉で説明してください。

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

回答:


120

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

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

一部の列は、一意性などの制約があり、すべての行に同じ値を入力できないため、高カーディナリティ列と呼ばれます。

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


10
大きな言葉に対するこのフェチとは何ですか。「個性」はうまくいきますね。
Pacerier、2015

8
@Pacerier:はい、データベースを扱っている人々はすでにリレーショナル理論、セット理論、数学にかなり精通していると思いますが。そして、彼らは集合論からこの用語を借りました:en.m.wikipedia.org/wiki/Cardinality
Alexander Torstling 15/07/17

27
@Pacerier、Distinctness is a bigword(by 1)
Drew

4
@Drew 、;)語彙素を比較する場合はそうではありません。
Pacerier、2015

8
@Pacerier Lexeme?そこでは「独特さ」も機能するのではないでしょうか。;)十分に努力すれば、言語全体を1単語に減らし、さまざまな繰り返しと一時停止によって自分自身を表現できます。
Jason、

34

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

SQL(構造化照会言語)、用語基数は指す一意の特定の列(属性)に含まれるデータ値のデータベース テーブル。カーディナリティが低いほど、列内の重複する要素が多くなります。したがって、カーディナリティが可能な限り低い列は、すべての行で同じ値になります。SQLデータベースは基数を使用して、特定のクエリに最適なクエリプランを決定します。


25

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

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

詳細情報


15

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

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


4
列にインデックスを付けるのが理にかなっている場合を理解しようとする場合、2番目の段落は重要です。
VMC 2017年

10

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

したがって、高いコーディナリティ値は以下を意味します。

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

7

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

セット "A"を次のようにします:A = {1,2,3}-そのセットのカーディナリティは| 3 |です。

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

mysqlのコンテキストでそれが意味することは、テーブルカラムのカーディナリティがそのカラムの一意の値の数であるということです。主キー列(例:table.id)のカーディナリティを表示している場合、テーブルの各行に一意のIDが1つあるため、その列のカーディナリティによって、テーブルに含まれる行数がわかります。そのテーブルで "COUNT(*)"を実行して行数を調べる必要はありません。カーディナリティを確認するだけです。


4

簡単に言うと、カーディナリティはテーブル内の行またはタプルの数です。列の数は「次数」と呼ばれます


4

マニュアルから:

カーディナリティ

インデックス内の一意の値の数の推定。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)

1
この回答には、あなたが自分で書いた内容が含まれていません。これは、MySQLのマニュアルとリンクしたブログ投稿のコラージュにすぎません。そしてその上に恐ろしくフォーマットされています。
Siguza 2017

1
これで、ソースが明確に表示され、フォーマットが改善されました。
carla 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.