【问题标题】:Can we create an index on a column containing NULL values in MySQL 5.7?我们可以在 MySQL 5.7 中包含 NULL 值的列上创建索引吗?
【发布时间】:2017-12-10 03:27:29
【问题描述】:

以下是 MySQL 文档中的文本:

表的主键表示列或列集 您在最重要的查询中使用的。它有一个相关的索引, 快速查询性能。 NOT 可提高查询性能 NULL 优化,因为它不能包含任何 NULL 值

我不理解上述文本中粗体字的句子的确切含义。有人请给我解释一下。

另外,请告诉我是否可以在 MySQL 5.7 中为包含 NULL 值的列创建索引?如果不是,是什么原因?

谢谢。

【问题讨论】:

  • a PRIMARY 键不能有 NULL 值,但可以在具有 NULL 值的列上创建其他索引。
  • @Used_By_Already :如果主键包含多个列怎么办?如果主键包含多于一列,它是否称为复合键?
  • 正确,复合键包含多个列,但复合(主)键的任何部分都不能为空。只有非主索引允许列有 NULLs
  • 在复合键的情况下,所涉及的列是否必须具有唯一且非空值?
  • 复合主索引必须形成唯一的值组合,不允许为空

标签: mysql indexing null primary-key mysql-5.7


【解决方案1】:

PRIMARY 键用于组织磁盘上的数据,因为与数据的物理排列方式有关,所以主键的任何部分都不能为 NULL。

非主索引可以有一个或多个允许 NULL 的列。 demo

CREATE TABLE `my_docs` (
  `id` int(6) unsigned NOT NULL AUTO_INCREMENT,
  `rev` int(3) ,
  `content` varchar(200) NOT NULL,
  PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;


INSERT INTO `my_docs` (`rev`, `content`) VALUES
  (1, 'The earth is flat'),
  (1, 'One hundred angels can dance on the head of a pin'),
  (NULL, 'The earth is flat and rests on a bull\'s horn'),
  (3, 'The earth is like a ball.');

alter table `my_docs` add key my_added_index (`rev`);

SELECT id, rev, content
FROM `my_docs`
where rev = 3

| id | rev |                   content |
|----|-----|---------------------------|
|  4 |   3 | The earth is like a ball. |


+---+-------------+-----------+------+----------------+----------------+---------+-------+------+----------+-------+
| d | select_type |   table   | type | possible_keys  |      key       | key_len |  ref  | rows | filtered | Extra |
+---+-------------+-----------+------+----------------+----------------+---------+-------+------+----------+-------+
| 1 |    SIMPLE   |   my_docs | ref  | my_added_index | my_added_index |       5 | const |    1 |   100.00 |       |
+---+-------------+-----------+------+----------------+----------------+---------+-------+------+----------+-------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 2019-08-06
    • 2019-12-22
    • 1970-01-01
    • 2015-04-04
    • 2015-01-11
    • 1970-01-01
    相关资源
    最近更新 更多