将记录移动到另一个表与"标志"列SQL性能

Pio*_*ler 6 sql database indexing performance schema

假设我有一个代表"任务队列"的表(数千万条记录).

任务可以"排队"或"完成".

如果我们想抓住10个要处理的任务,哪个表现更好?

  • 带有"flag"列的单个表,如ENUM/ BITTINYINT标记任务已完成或未完成(最终列上的索引)
  • 为排队任务分离表,完成任务并从排队完成后排除每个已完成任务

请注意,在开始时,我们有一些或没有完成的任务,但随着处理的进行,将有数百万已经完成的任务.

Fro*_*its 7

这可能没关系,但如果是我,我会使用一张桌子.这是我的推理:

首先,我们必须在此表上假设良好的索引,这将使快速查找.使用适当的索引,如果要查询排队的任务,"完成"任务的数量是10或100亿也无关紧要,DBMS只会查看排队的任务.

其次,当任务从"排队"移动到"完成"时,您将更新其状态.这需要DBMS对索引进行一些重组,但是没关系,他们已经在30年的时间里以高效率做到了这一点.

如果要将它们拆分为单独的表,基本上将记录从一个地方移动到另一个地方的维护将放在代码而不是DBMS索引重组代码中.哪些代码库经过了更好的测试,性能更高?:)

最后一个论点 - 如果你把它全部放在一个大表中,进一步调整这些任务的管理就会成为DBMS配置问题,而不是软件开发问题.这是我书中的一大胜利.您可以使用各种疯狂的配置来提高任何DBMS的性能,包括垂直和水平分区等.如果您分发数据的方式是通过软件中嵌入的某种方案,那么这些东西将不会是选项.

所以底线 - 如果你采用2表方法,我认为如果你考虑到你的代码必须做的额外工作来移动记录,那么如果你采用一个表方法,它将表现得非常相似.如果从一个表中删除"打开"任务并将其粘贴到"完成"表中,请记住DBMS仍然必须更新源表上的"打开"索引.因为可能不会有很大的性能差异,所以你应该使用one table方法,因为它对你的工作较少,并且在以后为你提供更多的灵活性(通过配置,副软件提高速度)