mysql的innodb引擎数据库批量删除大量数据很慢

发布于 2022-09-06 10:26:47 字数 2384 浏览 22 评论 0

因为不能用Truncate(因为只是删除其中少部分数据),由于要求此表中的数据只保留当天的数据,所以每当在凌晨的某一时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据,使用delete删除表中的上百万条记录时,MySQL删除速度非常缓慢每一万条记录需要大概4分钟左右,这样删除所有无用数据要达到八个小时以上,这是难以接受的。。
网上搜到此文(http://blog.csdn.net/gao14401...[MSSQL、MySQL 数据库删除大批量千万级百万级数据的优化]
其中说到每次删除记录,数据库都要相应地更新索引,这是很慢的IO操作,而且后面索引碎片越来越多,就更慢。
我采取其提供的删除索引再删除数据再重建索引的方法,并没有发现删除速度有提升,而且时不时还会死锁

我的数据表结构如下:

CREATE TABLE `tbplaylog_copy` (
  `Pid` int(11) NOT NULL AUTO_INCREMENT,
  `Company_id` int(11) NOT NULL DEFAULT '0' COMMENT '??id',
  `uid` int(11) NOT NULL COMMENT '"??ID"',
  `Devno` varchar(32) CHARACTER SET utf8 NOT NULL COMMENT '????',
  `Ad` int(11) NOT NULL COMMENT '????',
  `MakeTime` int(11) NOT NULL COMMENT '????',
  `LastTime` int(11) NOT NULL COMMENT '??????',
  `StartTime` int(11) NOT NULL COMMENT '???????(0,24*60)',
  `EndPoint` int(11) NOT NULL COMMENT '????????(0,24*60)',
  `Status` int(11) NOT NULL COMMENT '???1-????0-???',
  `Note` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '????',
  `Valid` int(11) NOT NULL COMMENT '???',
  `Type` int(11) NOT NULL COMMENT '0,???1????2???',
  `PlayStartTime` int(11) NOT NULL DEFAULT '0',
  `PlayEndTime` int(11) NOT NULL DEFAULT '0',
  `DownloadTime` int(11) NOT NULL DEFAULT '0',
  `DeleteTime` int(11) NOT NULL DEFAULT '0',
  `TemplateId` int(11) NOT NULL DEFAULT '0',
  `ad_adnum` int(11) NOT NULL COMMENT '???ad_id',
  `length` int(11) NOT NULL,
  `DownloadPercent` int(11) NOT NULL DEFAULT '0' COMMENT '???????',
  `DownloadSuccess` int(11) NOT NULL DEFAULT '0' COMMENT '\r\n0-??\r\n1-??”',
  `Playlist_id` int(11) NOT NULL,
  `Delete` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1???',
  `Reset` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1???',
  `source` int(2) NOT NULL,
  `distribute` int(2) NOT NULL DEFAULT '-2' COMMENT '0??-2??',
  PRIMARY KEY (`Pid`),
  KEY `starttime` (`StartTime`) USING BTREE,
  KEY `Devno` (`Devno`),
  KEY `playstarttime` (`PlayStartTime`),
  KEY `index_playlist_id` (`Playlist_id`),
  KEY `ad` (`Ad`),
  KEY `company_id` (`Company_id`)
) ENGINE=InnoDB AUTO_INCREMENT=8760113 DEFAULT CHARSET=latin1;

我的删除语句

DELETE * FROM tbplaylog WHERE tbplaylog.StartTime < ? OR tbplaylog.StartTime > ? ORDER BY Pid LIMIT 10000

数据量为1000w条

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

就此别过 2022-09-13 10:26:47

1、删除今天以前的数据,那是说每天凌晨删除昨天数据即可,你一天就1000W?删除也不需要排序,直接delete from table where 。。 limit 1000即可。另外也可以每次删除更少量的数据,避免产生锁,执行频率高一点就行。
2、也可以采用分区的方式,按天分区,每天删除过期分区表

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文