假设如下两种做法:
调用某个远程接口前,先入库一条记录,内容是远程接口调用的内容,以及状态,状态为INIT,调用远程接口成功,状态设为FINISHED,不成功不改变状态。然后定时任务定时捞取状态为PENDING的记录,重试调用。
另一种做法是调用某个远程接口前,先入库一条记录,内容是远程接口调用的内容,调用远程接口成功,将该记录删除,不成功不删除,定时任务定时捞取,重试调用,同样,成功删除,不成功不删除。
感觉后者对数据库性能更好,即便前者对状态做索引,因为状态只有两个值,而PENDING状态的记录数目一般不打,导致B+树结构完全FINISHED状态那边臃肿,感觉性能不太好吧?
根据你的描述,将会有很多记录处于
FINISHED
状态,这对于处理INIT
或PENDING
记录的业务场景来说,并没有什么影响。唯一要注意的就是任何 SQL 语句如果带了status='FINISHED'
或status in ('FINISHED',...)
,这样的条件,就一定要注意避免大规模排序。什么意思呢,一个典型场景就是订单记录,已完成的订单通常占据 99.999% 的记录量,而且查询的时候通常都会按照时间排序,这样的查询就需要额外优化,极端情况下甚至不允许在 MySQL 里面查,而是同步到 ES 或其他地方。