我有一个 MySQL 表,其中90% 的行的索引 INT列将为0。如果我将这些行改为使用 NULL而不是0,它们是否会被排除在索引之外,从而使索引缩小约90% ?
INT
NULL
看起来它也索引了 NULL。
运行此命令时要小心,因为在创建索引期间,MySQL 将锁定 WRITES 的表。即使列为空(所有空值) ,在大型表上构建索引也需要一段时间。
参考 。
不,它将继续包括它们,但不要对任何一种情况的后果做过多的假设。很大程度上取决于其他值的范围(用谷歌搜索“基数”)。
对于这种情况,MSSQL 有一种新的索引类型,称为“筛选索引”(即在索引中包含基于筛选器的记录)。DBASE 类型的系统过去也有类似的功能,而且非常方便。
允许列为空将向列的存储需求添加一个字节。这将导致增加的指数大小,这可能是不好的。也就是说,如果您的许多查询被更改为使用“ IS NULL”或“ NOT NULL”,那么它们总体上可能比进行值比较更快。
我的直觉告诉我不是无效的,但有一个答案: 测试!
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。
col_name IS NULL
col_name = constant_value
IS NULL
每个索引都有一个基数,表示有多少不同的值被索引。AFAIK 说索引对许多行重复相同的值是不合理的,但是索引只会对许多行的聚集索引处理一个重复的值(对于这个字段有空值的行) ,并且保持聚集索引的引用 ID 意味着: 每一个带有空值索引字段的行浪费一个和 PK 一样大的大小(因此专家建议如果你有一个合成的 PK,应该有一个合理的 PK 大小)。