列上的索引,仅用于IS NULL和IS NOT NULL

时间:2011-11-06 07:44:00

标签: mysql null indexing

我的表格中有一列已删除。在每个sql语句中,我检查此标志是否为空。有人想删除条目,标志设置为当前时间戳。

如果要还原条目,此时间戳用于还原它们。这是使用此列的值时的唯一用例。

在所有其他情况下,重要的是要知道它是否为空或是非空。

将来,该表可以并且将包含数百万行。

在此列上创建索引是否有用?因为99%的陈述和用例不关心价值。 MySQL是否优化了IS NULL条件,因此不需要索引?

3 个答案:

答案 0 :(得分:2)

'deleted'上的索引也将索引空值,从而允许更快地查找非null / null

我认为这在这种情况下就足够了,并且不会造成太多开销,因为时间戳是在删除时设置的,因此不会发生太大的变化。 (相反:使用一直改变的编辑时间戳,有时只设置为null,每次更改记录时都会调整索引。这可能不是最佳的。这不是这种情况。)< / p>

(另外,但我不知道索引器是否足够智能以利用它,预期的更改总是到达索引的末尾,无论是在null端还是在'最近'端。)

当然,配置文件(查询执行时间和存储空间,如果重要),以确定是否存在由此产生的实际问题。

答案 1 :(得分:1)

无法创建“归档”表并将已删除的行及其时间戳存储起来。 如果用户想要恢复一行,则必须将其从存档转移到主表。

并且您不必在每个查询中检查“flag IS NOT NULL”

答案 2 :(得分:0)

  1. 根据本书(High Performance MySQL, 2nd Edition),不建议在MySQL的列定义中使用“allow NULL”。 MySQL使用额外的字节来存储单元格的状态(Null或not Null),索引大小将大于没有“allow NULL”的索引大小。更好的解决方案是为活动行创建行TINYINT数据类型和存储值1,为已删除的行存储0。因此,建议永远不要在列定义中使用allow NULL。