我有一个 MySQL 表,其中INT
90% 的行的索引列将为 0。如果我将这些行更改为使用NULL
而不是 0,它们是否会被排除在索引之外,从而使索引缩小约 90%?
5 回答
http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html
MySQL 可以对其col_name IS NULL
用于col_name = constant_value
. 例如,MySQL 可以使用索引和范围来搜索NULL
with IS NULL
。
允许列为空将增加一个字节到列的存储要求。这将导致索引大小增加,这可能不好。也就是说,如果您的许多查询更改为使用“IS NULL”或“NOT NULL”,它们可能比进行值比较总体上更快。
我的直觉会告诉我不为空,但有一个答案:测试!
不,它将继续包括它们,但不要对任何一种情况的后果做出太多假设。很大程度上取决于其他值的范围(谷歌为“基数”)。
对于这种情况,MSSQL 有一种称为“过滤索引”的新索引类型(即基于过滤器在索引中包含记录)。dBASE 类型的系统过去也有类似的功能,而且非常方便。
每个索引都有一个基数,表示索引了多少不同的值。AFAIK说索引对许多行重复相同的值不是一个合理的想法,但索引只会将重复值寻址到许多行的聚集索引(该字段具有空值的行)并保持聚集索引的参考ID意思是:每行具有 NULL 值索引字段会浪费与 PK 一样大的大小(因此,如果您有复合 PK,专家建议使用合理的 PK 大小)。