gpt4 book ai didi

NULL 值的 MySQL 基数

转载 作者:可可西里 更新时间:2023-11-01 08:05:22 29 4
gpt4 key购买 nike

这是一张真实 table 的再现。假设我有这段代码:

CREATE TABLE `testTable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`col` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

INSERT INTO `testTable` (col) VALUES (NULL), ('a'), (NULL), ('b'), (NULL), ('c'), (NULL), ('d'), (NULL), ('e'), (NULL), ('f');
ALTER TABLE `testTable` ADD INDEX (`col`);
OPTIMIZE TABLE `testTable`;
SHOW INDEX FROM `testTable`;

我明白了

+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| testTable | 0 | PRIMARY | 1 | id | A | 12 | NULL | NULL | | BTREE | | |
| testTable | 1 | col | 1 | col | A | 12 | NULL | NULL | YES | BTREE | | |
+-----------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

为什么 col 的基数是 12 而不是 7?有 7 个唯一值,那么为什么所有 NULL 都单独计数?这会增加索引的大小吗?一旦我使用空字符串而不是 NULL 值,基数就会下降。哪个是首选值?

最佳答案

来自 MySQL 文档 here

Cardinality is counted based on statistics stored as integers, so the value is not necessarily exact even for small tables

这意味着 NULL 值不会作为重复项存储在列中,这是有道理的。 NULL 是未知的值。因此,没有两个 NULL 是相等的。

引用here

编辑:这就是为什么你不能将 SQL 中的 NULL 值与 = 进行比较,你总是必须使用 is NULL

结论:基数 12 是正确的。

编辑:我忘了回答你的其他问题。

这会增加索引的大小吗?答案在 MySQL 文档中

A UNIQUE index creates a constraint such that all values in the index must be distinct. An error occurs if you try to add a new row with a key value that matches an existing row. This constraint does not apply to NULL values except for the BDB storage engine. For other engines, a UNIQUE index permits multiple NULL values for columns that can contain NULL. If you specify a prefix value for a column in a UNIQUE index, the column values must be unique within the prefix.

一旦我使用空字符串而不是 NULL 值,基数就会下降。哪个是首选值? 没有首选 值本身。如果空字符串适合您的目的,请使用它们。基数下降是因为 empty string = empty string 是正确的,但 NULL = NULL 不是

关于NULL 值的 MySQL 基数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31545802/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com