当前位置: 首页 > 面试题库 >

将记录移到另一个表与“滞后”列的SQL性能

韦澄邈
2023-03-14
问题内容

假设我有一个表代表“任务队列”(几千万条记录)。

任务可以“排队”或“完成”。

如果我们要处理10个任务,哪个执行得更好?

  • 以“标志”列单表像ENUM/ BIT/TINYINT标记任务为已完成或没有(最终指数列)
  • 单独的表用于排队的任务和已完成的任务,并将每个已完成的任务从插入到已完成的已排队队列中删除

请注意,一开始,我们只有很少或没有完成的任务,但是随着处理的进行,将有数以百万计的已经完成的任务。


问题答案:

可能没关系,但是如果是我,我将使用一张桌子。这是我的理由:

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

其次,随着任务从“排队”移动到“完成”,您将要更新其状态。这需要DBMS对索引进行一些重组,但是没关系,他们已经高效地执行了30多年了。

如果将它们分成单独的表,则将记录从一个位置移动到另一位置的维护工作基本上将放在 代码中,
而不是在DBMS索引重组代码中。哪些代码库经过了更好的测试且性能更高?:)

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

因此,最重要的是-
如果您使用2表方法,那么我认为它的html" target="_blank">性能将与您使用单表方法非常相似,一旦考虑到额外的工作,您的代码将需要执行一些工作来移动记录。如果从一个表中删除“打开”任务并将其粘贴到“完成”表中,请记住,DBMS仍将必须更新源表上的“打开”索引。因为可能不会有很大的性能差异,所以应该使用一个表的方法,因为它对您的工作较少,并且以后为您提供了更大的灵活性(通过配置和副软件来提高速度)



 类似资料:
  • 操作步骤: ①在"图层管理"模块,选择一个带有数据的标注图层,点击"数据视图"。 ②在数据视图中勾选想要移动的记录。 ③点击"移动"按钮。 ④弹出数据移动窗口。 ⑤选择移动至"新建图层"或是"已有标注/线路/区域图层" ,点击移动。 注意: ●把一个图层中的全部或部分数据移动到新建图层或是已有图层,原图层将不作保留。 ●目标图层的字段结构和当前图层必须一致,否则操作失败。 操作动图: [查看原图]

  • 我试图通过将不需要的记录移动到墓地表中,在数据库中进行一些垃圾收集。如果我有这四张桌子- 版本(id为主键) Version_history(version_id是外键) Version_graveyard(此处已丢弃版本行) Version_history_graveyard(此处为废弃版本历史记录行) 它包括以下步骤- 获取要删除的所有版本ID 通知所有人要删除的版本ID。(所以我需要在实际移

  • 问题内容: 我想通过将记录从一张桌子移到另一张桌子来对学生进行归档。这是我尝试使用的代码: 我遇到的问题是我遇到错误: 致命错误:XX行/archive-student.php中的内存不足(已分配80478208)(试图分配80216043字节) 除了有一个名为archive的列并从0更改为1之外,是否有其他方法可以执行此操作?这是因为我有30-50页选择表的记录。:) 问题答案: 就那么简单。

  • 问题内容: 我有两个看起来像这样的表: 表:案例 id 名称 状态 case_no 表:注意事项 id case_id note_date 注释 我希望能够创建一个查询,以从案例表中获取数据,并仅从注释表中获取案例表中每一行的最新条目。到目前为止,我根本没有运气。 任何指针将不胜感激 问题答案: 这只会返回带有注释的案例: 如果需要所有案例,无论是否附带注释:

  • 问题内容: 我不知道为什么我对此查询感到困惑。 我有两个表:带有记录和带有记录。两个表都需要包含相同的数据,但是存在一些不匹配的情况。 我需要编写一个mysql查询以插入从到的丢失记录。 最后,两者和应该相同。 我不想先截断所有条目,然后再从另一个表中插入。因此,请提供任何帮助。 谢谢你。 问题答案: 也可以使用它。这将避免像John Woo的回答那样避免子查询的开销(当系统可能为外部查询的 每条

  • 问题内容: 我有以下两个SQL表(在MySQL中): 如何找出哪些电话是由人,他们提出是不是在?所需的输出将是: 任何帮助将非常感激。 问题答案: 有几种不同的方法可以执行此操作,效率各不相同,具体取决于查询优化器的性能以及两个表的相对大小: 这是最简短的陈述,如果您的电话簿很短,则可能是最快的陈述: 或者(由于Alterlife) 或(感谢WOPR) (如其他人所说,忽略它通常最好只选择想要的列