MySQL是否索引NULL值?


69

我有一个MySQL表,其中INT90%的行的索引列将为0。如果我将这些行改为使用NULL而不是使用0,是否会将它们排除在索引之外,从而使索引缩小约90%?

Answers:



7

看起来它也确实对NULLs进行了索引。

运行此命令时要小心,因为MySQL会在创建索引期间为WRITES锁定表。即使列为空(全为空),在大型表上构建索引也可能需要一段时间。

参考


2
您是如何得出这个结论的?我没有提到这个话题。
太多的PHP

在文章底部的评论中。我拉出了相关部分。
比尔蜥蜴

6
我相信在大型表上花费一些时间的原因是因为MySQL必须读取整个表,而不是因为它正在建立一个巨大的索引。我可能是错的。
太多的PHP

3
@toomuchphp是的,实际上“在大型表上要花一点时间...即使该列是...所有空值”也可能被解释为“处理空值很快[因为它们没有被索引],但是如果表很大。 “
KajMagnus 2012年

3

允许列为空将为该列的存储需求添加一个字节。这将导致索引大小增加,这可能不是很好。这就是说,如果将许多查询更改为使用“ IS NULL”或“ NOT NULL”,它们的整体速度可能比进行值比较快。

我的直觉会告诉我不是null,但是有一个答案:测试!


1
问题是该指数是否会增加规模。答案是,这将增加第二句话的索引大小。
JD Fitz.Gerald 2011年

3
问的MySQL索引是否空列(它)。该描述似乎提出了一个稍有不同的问题,但实际上实际上只是在阐明为什么要提出(标题)问题。此外,由于人们在很大程度上根据问题的标题来选择是否阅读问题,因此我认为在大多数情况下,标题形式优先于描述形式。
user359996 2011年

2
同样,允许空列会向该(而不是该列)添加一个字节,除非已经有8个可空列(其中有多个),因为空是位图。实际上,这可以很好地节省空间,因为空值仅需要存储在位图中。
user359996 2011年

2
在这种情况下,90%的时间为NULL的INT列90%的时间将占用1个或更少的字节,而10%的时间在4至5个字节之间。平均而言,这总是少于4个字节,这就是不允许NULL的代价。
user359996 2011年

1

不,它将继续包括它们,但不要对两种情况下的后果做出太多假设。在很大程度上取决于其他值的范围(google为“基数”)。

针对这种情况,MSSQL具有一种称为“过滤索引”的新索引类型(即,基于过滤器的索引中包含记录)。dBASE类型的系统曾经具有类似的功能,并且非常方便。


1

每个索引都有一个基数,表示要索引多少个不同的值。AFAIK说索引对许多行重复相同的值不是一个合理的主意,但是索引只会将重复的值寻址到许多行的聚集索引(该字段的行具有空值)并保留聚集索引的引用ID意味着:带有NULL值索引字段的每一行浪费的大小与PK一样大(因此,如果您有复合PK,专家建议使用合理的PK大小)。


-1

只是为了为该主题带来更多信息。看一看您的表首先使用哪种存储引擎。

如果使用的是MyISAM,InnoDB或MEMORY存储引擎,则可以在具有NULL值的列上添加索引。否则,您必须声明一个索引列NOT NULL,并且您不能在该列中插入NULL。

https://dev.mysql.com/doc/refman/8.0/zh-CN/problems-with-null.html


这不能回答问题。也许添加评论或建议对另一个答案进行编辑。
NineToeNerd

这个主题已经有了不错的答案,因此,正如我所说,无论人们选择哪种答案,我都只是在共享其他信息。
Danilo Akamine
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.