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

如何提高大型InnoDB表的DELETE FROM性能?

姬翰林
2023-03-14
问题内容

我有一个相当大的InnoDB表,其中包含约1000万行(并且不断增长,预计它将变成该大小的20倍)。每行不是那么大(平均131
B),但是我不得不不时删除其中的一大块,这需要很长时间。这是表结构:

 CREATE TABLE `problematic_table` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `taxid` int(10) unsigned NOT NULL,
    `blastdb_path` varchar(255) NOT NULL,
    `query` char(32) NOT NULL,
    `target` int(10) unsigned NOT NULL,
    `score` double NOT NULL,
    `evalue` varchar(100) NOT NULL,
    `log_evalue` double NOT NULL DEFAULT '-999',
    `start` int(10) unsigned DEFAULT NULL,
    `end` int(10) unsigned DEFAULT NULL,
    PRIMARY KEY (`id`),
    KEY `taxid` (`taxid`),
    KEY `query` (`query`),
    KEY `target` (`target`),
    KEY `log_evalue` (`log_evalue`)
) ENGINE=InnoDB AUTO_INCREMENT=7888676 DEFAULT CHARSET=latin1;

从表中删除大块的查询就像这样:

DELETE FROM problematic_table WHERE problematic_table.taxid = '57';

这样的查询只花了将近一个小时的时间。我可以想象索引重写开销使这些查询非常慢。

我正在开发一个将在现有html" target="_blank">数据库上运行的应用程序。我很可能无法控制服务器变量,除非我强制对它们进行更改(我不希望这样做),所以我担心更改这些变量的建议价值不大。

我已经尝试过将INSERT ... SELECT那些我不想删除的行删除到临时表中,而只是删除其余的行,但是随着to-
delete与.keep的比率向keep转变,这不再是一个有用的解决方案。

这是一个可以经常看到一个表格INSERTS和SELECTS
IN的未来,但没有UPDATE秒。基本上,它是一个日志记录和参考表,需要不时删除其部分内容。

我可以通过限制索引长度来改进此表上的索引吗?转换为MyISAM帮助会DISABLE KEYS在交易过程中提供支持吗?我还能尝试什么来提高DELETE性能?

编辑: 一个这样的删除将在大约一百万行的顺序。


问题答案:

该解决方案完成后可以提供更好的性能,但是该过程可能需要一些时间才能实现。

BIT可以添加一个新列,默认TRUE为“活动”和FALSE“非活动”。如果状态不够,则可以使用TINYINT256个可能的值。

添加此新列可能会花费很长时间,但是一旦结束,您的更新就应该快得多,只要您PRIMARY像删除操作一样,不对这个新列编制索引就可以了。

InnoDB之所以花这么长时间DELETE在如此庞大的表上,是因为集群索引。它根据您的PRIMARY,首先UNIQUE找到的表或可以找到的合适的替代表(如果找不到PRIMARY或)将UNIQUE其物理排序,因此,删除一行后,它现在将整个表在磁盘上重新排序以提高速度,碎片整理。所以花的时间不是DELETE那么长;这是删除该行后的物理重新排序。

创建固定宽度的列并对其进行更新而不是删除时,由于行和表本身消耗的空间是恒定的,因此无需对巨大的表进行物理重新排序。

在下班时间,DELETE可以使用一个来删除不必要的行。与删除单个行相比,此操作将仍然很慢,但总体上要快得多。



 类似资料:
  • 我有一个名为Emails的列族,我正在将邮件保存到这个CF中,编写5000封邮件需要100秒。 我使用的是i3处理器,8gb内存。我的数据中心有6个节点,复制因子=2。 我们存储在卡桑德拉中的数据大小会影响性能吗?影响写入性能的所有因素是什么,如何提高性能? 预先感谢..

  • 在我的ASP. net网站,我有一个连接到SQL服务器快速数据库。有时候我确实会犯很多错误,比如 系统。异常:超时已过期。从池中获取连接之前的超时时间。这可能是因为所有池连接都在使用中,并且达到了最大池大小。 搜索错误后,我发现可能是由于SQL Server连接未关闭。但是我已经正确地使用了SQL Server连接,并且正确地处理了它。我已使用using语句处理连接。在我的应用程序中,我在一天中的

  • 问题内容: 我在公司中多次设计数据库。为了提高数据库的性能,我只寻找标准化和索引。 如果要求您提高数据库的性能,该数据库包含大约250个表以及一些具有数百万个记录的表,那么您将寻找什么不同的东西? 提前致谢。 问题答案: 优化逻辑设计 逻辑级别是关于查询和表本身的结构。首先尝试最大程度地发挥这一作用。目标是在逻辑级别上访问尽可能少的数据。 拥有最高效的SQL查询 设计支持应用程序需求的逻辑架构(例

  • 我的Java spring应用程序中有一个原生查询,它访问oracle DB并获取一个很大的结果集(接近20000条记录)。当前的方法是,我使用spring的JdbcTemplate来执行查询,这需要大约几分钟的时间来执行查询。提高执行此查询的性能的更好方法是什么?

  • 问题内容: 我有一个巨大的数据集,其中包含数千行,每个行具有大约10个字段,大约2MB的数据。我需要在浏览器中显示它。最简单的方法(获取数据,将其放入,执行其工作)可以很好地工作,但是当它开始将节点插入DOM时,它会使浏览器冻结大约半分钟。我应该如何解决这个问题? 一种选择是将行逐行追加,并等待完成向DOM中插入一个块后再移至下一个。但是AFAIK ngRepeat在完成“重复”操作时不会返回报告

  • 问题内容: 我有2张桌子,和。用户可以有很多游戏。我需要所有有人数的人,以及他们的人数(有专栏的)。 附言:我需要将所有数据加载到管理表中。由于游戏太多。我决定对数据进行分页和限制。但是,甚至限制以下查询也需要花费相同的时间。如何更好地查询? 问题答案: 您可以在下面尝试使用表达式