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

本文探讨了如何提高大型InnoDB表的DELETE FROM操作性能。在一个包含约1000万行且不断增长的表中,执行删除操作耗时较长。通过分析表结构和查询方式,提出可能的优化策略,包括限制索引长度、考虑转换为MyISAM、利用DISABLE KEYS等,以解决在日志和参考表中大量删除数据时的效率问题。
摘要由CSDN通过智能技术生成

我有一个相当大的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';

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

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

我已经尝试过将INSERT ... SELECT那些我不想删除的行删除到临时表中,而只是删除其余的行,但是随着to-

delete与.keep的比率向keep转变,这不再是一个有用的解决方案。

这是一个可以经常看到一个表格INSERTS和SELECTS

IN的未来,但没有UPDATE秒。基本上,它是一个日志记录和参考表,需要不时删除其部分内容。

我可以通过限制索引长度来改进此表上的索引吗?转换为MyISAM帮助会DISABLE

KEYS在交易过程中提供支持吗?我还能尝试什么来提高DELETE性能?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值