如果我只用FIELD搜索不是null,我应该索引一个字段吗?

时间:2009-11-12 20:02:24

标签: mysql indexing

我有一个可以为空的日期时间字段的表。

我会执行这样的查询:

select * from TABLE where FIELD is not null
select * from TABLE where FIELD is null

我应该索引此字段还是没有必要?我不会在该字段中搜索某些日期时间值。

3 个答案:

答案 0 :(得分:2)

可能没必要。

当索引可以使用(并且有帮助)时唯一可能的边缘情况是,null / not-null行的比例相当大(例如,表中有100个NULL的日期时间为100,000行)。在这种情况下,select * from TABLE where FIELD is null会使用索引并且速度要快得多。

答案 1 :(得分:1)

简而言之:是的。

稍微长一点:是的。 ; - )

(From http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html) - “如果col_name被索引,则使用col_name IS NULL搜索使用索引。”

答案 2 :(得分:0)

这取决于唯一值的数量和表中的记录数。如果你只是搜索一个列是否为null,你可能会有一个查询使用它而一个不依赖于表中的空值总数。

例如:如果您有一个包含99%记录的表,则查询列为null,并且您在列上放置/有一个索引,然后执行:

SELECT columnIndexed FROM blah WHERE columnIndexed is null;

优化器很可能不会使用索引。它不会因为读取索引然后读取记录的关联数据而花费更多,而不是直接访问表。索引使用基于表的统计分析,其中一个主要参与者是值的基数。通常,索引在表中选择行的一小部分时效果最佳,并提供最佳性能。因此,如果您更改上述查询以选择columnIndexed不为null的位置,则绑定使用索引。

有关详细信息,请查看以下内容:http://dev.mysql.com/doc/refman/5.1/en/myisam-index-statistics.html