MySQL的索引是否为空值?

我有一个MySQL表,索引INT列将为90%的行为0。 如果我改变这些行使用NULL而不是0,他们会被排除在索引,使索引约90%更小?

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

MySQL可以对col_name = constant_value使用col_name IS NULL来执行相同的优化。 例如,MySQL可以使用索引和范围来search带有IS NULL的NULL

它看起来像索引NULL也是。

当你运行这个时要小心,因为在索引创build期间,MySQL将lockingWRITES表。 即使列是空的(所有空值),构build索引也可能需要一些时间。

参考 。

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

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

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

MSSQL有一个新的索引types称为“过滤索引”这种types的情况下(即包括基于filter索引中的logging)。 dBASEtypes的系统曾经有类似的function,而且非常方便。

每个索引有一个基数意味着索引了多less不同的值。 AFAIK说索引对许多行重复相同的值是不合理的想法,但是索引只会将多个行的聚集索引(对于该字段具有空值的行)的重复值进行寻址并且保持聚集索引的引用ID意思是:每一行有一个NULL值的索引字段浪费了一个和PK一样大的尺寸(因为这个原因,如果你有复合PK,专家build议有一个合理的PK尺寸)。