我有一个mysql表,其中90%的行的索引INT列将为0。如果我将这些行更改为使用NULL而不是0,它们是否会被排除在索引之外,使索引缩小约90%?
答案 0 :(得分:23)
http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html
MySQL可以对col_name IS NULL执行相同的优化,它可以用于col_name = constant_value。例如,MySQL可以使用索引和范围来搜索带有IS NULL的NULL
答案 1 :(得分:7)
答案 2 :(得分:2)
允许列为null将在列的存储要求中添加一个字节。这将导致索引大小增加,这可能不太好。也就是说,如果你的很多查询被改为使用“IS NULL”或“NOT NULL”,那么它们总体上可能比进行价值比较更快。
我的直觉告诉我不是空的,但有一个答案:测试!
答案 3 :(得分:1)
不,它会继续包括它们,但不要对这两种情况的后果做出太多假设。很大程度上取决于其他值的范围(google为“基数”)。
对于这种情况,MSSQL有一种称为“过滤索引”的新索引类型(即包括基于过滤器的索引中的记录)。 dBASE类型的系统曾经具有类似的功能,而且非常方便。
答案 4 :(得分:1)
每个索引都有一个基数,表示索引了多少个不同的值。 AFAIK指出索引为许多行重复相同的值是不合理的,但索引只会解决许多行的聚集索引的重复值(此字段具有空值的行)并保留引用ID聚集索引的意思是:每个具有NULL值索引字段的行浪费的大小与PK一样大(因此,如果您有复合PK,专家建议使用合理的PK大小)。
答案 5 :(得分:-1)
只需带更多有关此主题的信息。 看一看您的表首先使用哪种存储引擎。
您可以在具有NULL值的列上添加索引,如果您是 使用MyISAM,InnoDB或MEMORY存储引擎。不然你 必须声明一个索引列NOT NULL,并且您不能插入NULL 进入列。
https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html