一个数据库表的字段只有两个值且一个值得记录数目很少,做索引有什么问题吗?

假设如下两种做法:

调用某个远程接口前,先入库一条记录,内容是远程接口调用的内容,以及状态,状态为INIT,调用远程接口成功,状态设为FINISHED,不成功不改变状态。然后定时任务定时捞取状态为PENDING的记录,重试调用。

另一种做法是调用某个远程接口前,先入库一条记录,内容是远程接口调用的内容,调用远程接口成功,将该记录删除,不成功不删除,定时任务定时捞取,重试调用,同样,成功删除,不成功不删除。

感觉后者对数据库性能更好,即便前者对状态做索引,因为状态只有两个值,而PENDING状态的记录数目一般不打,导致B+树结构完全FINISHED状态那边臃肿,感觉性能不太好吧?

阅读 3.9k
3 个回答

根据你的描述,将会有很多记录处于 FINISHED 状态,这对于处理 INITPENDING 记录的业务场景来说,并没有什么影响。唯一要注意的就是任何 SQL 语句如果带了 status='FINISHED'status in ('FINISHED',...),这样的条件,就一定要注意避免大规模排序。

什么意思呢,一个典型场景就是订单记录,已完成的订单通常占据 99.999% 的记录量,而且查询的时候通常都会按照时间排序,这样的查询就需要额外优化,极端情况下甚至不允许在 MySQL 里面查,而是同步到 ES 或其他地方。

只有两种值的字段不应该加索引

数据记录,低于1000条左右,就没必要加索引……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题