假设我有一个代表“任务队列”的表(数千万条记录)。
任务可以“排队”或“完成”。
如果我们想抓住10个要处理的任务,哪个效果更好?
ENUM
/ BIT
/ TINYINT
标记任务已完成或未完成(最终列上的索引)请注意,在开始时,我们有几个或没有完成的任务,但随着处理的进行,将有数百个已经完成的任务。
答案 0 :(得分:7)
这可能并不重要,但如果是我,我会使用一张桌子。这是我的理由:
首先,我们必须在这个表上假设好的索引,这就是快速查找的原因。使用适当的索引,如果要查询排队的任务,那么"完成"的数量是否重要。任务是10或100亿,DBMS只会查看排队的任务。
其次,当任务从"排队"完成"完成",您将更新其状态。这需要DBMS对索引进行一些重组,但是没关系,他们已经做了30年以来的高效率。
如果要将它们拆分为单独的表,基本上将记录从一个地方移动到另一个地方的维护将放在您的代码而不是DBMS索引重组代码中。哪些代码库经过了更好的测试,性能更高? :)
最后一个论点 - 如果你把它全部放在一个大表中,那么这些任务管理的进一步性能调整就会成为DBMS配置问题,而不是软件开发问题。这是我书中的一大胜利。您可以使用各种疯狂的配置来提高任何DBMS的性能,包括垂直和水平分区等。如果您分发数据的方式是通过软件中嵌入的某种方案,那么这些选项将不会成为选择。
所以底线 - 如果你采用2表格式方法,我认为如果你考虑到你的代码必须做的额外工作,那么它的执行方式会非常相似移动记录。如果删除&#34;打开&#34;从一张桌子上完成任务并将其粘贴到一个表格中。表,请记住DBMS仍然需要更新&#34;打开&#34;源表上的索引。因为可能不会出现很大的性能差异,所以您应该使用一种表格方法,因为它对您的工作较少,并且在以后为您提供更大的灵活性(通过配置,副软件提高速度)< / p>