71

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

4

5 回答 5

31

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL 可以对其col_name IS NULL用于col_name = constant_value. 例如,MySQL 可以使用索引和范围来搜索NULLwith IS NULL

于 2013-05-19T17:32:04.563 回答
9

看起来它也索引了NULLs 。

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

参考

于 2008-11-14T01:52:30.347 回答
3

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

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

于 2008-11-14T10:45:04.047 回答
1

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

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

于 2008-11-14T02:22:10.647 回答
1

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

于 2016-08-26T15:19:50.120 回答