首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >列上的索引仅用于NULL和NULL。

问列上的索引仅用于NULL和NULL。
EN

Stack Overflow用户
提问于 2011-11-06 07:43:59
回答 3查看 4.9K关注 0票数 9

我的桌子上有一栏被删除了。在每个sql语句上,我都检查此标志是否为NULL。是否有人要删除条目,则标志设置为当前时间戳。

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

在所有其他情况下,唯一重要的是知道它是空的还是非空的。

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

在该列上创建索引有用吗?因为99%的语句和用例不关心值。MySQL优化是否为空条件,因此不需要索引?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-06 11:07:18

对“已删除”的索引也将索引为空值,从而允许更快地查找非空/空值。

在这种情况下,我认为这就足够了,而且不会造成太多的开销,因为时间戳是在删除时设置的,因此不会有太多的更改。(相反:使用一直被更改的编辑时间戳(有时只设置为null )将导致每次更改记录时调整索引。这可能不是最理想的。(这里的情况并非如此。)

(而且,我不知道索引器是否足够聪明,可以利用这一点,预期的变化总是会到达索引的末尾,无论是在空端还是在‘最近’端。)

当然,配置文件(查询执行时间和存储空间都很重要)来确定是否存在实际问题。

票数 3
EN

Stack Overflow用户

发布于 2011-11-06 07:47:22

您不能创建一个“归档”表,并存储已删除的行及其时间戳。如果用户希望还原一行,您只需将其从归档文件传输到主表即可。

而且您不必在每个查询中检查“标志不是空”

票数 1
EN

Stack Overflow用户

发布于 2011-11-06 10:39:27

  1. 根据本书(高性能MySQL,第二版),不建议在MySQL中的列定义中使用“允许NULL”。MySQL使用额外的字节来存储单元格状态(Null或Null),索引大小将大于没有“允许NULL”的情况。更好的解决方案是使行TINYINT数据类型和存储值1用于活动行,0用于已删除的行。因此,建议永远不要在列定义中使用allow。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8025814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档