mysql的innodb引擎数据库批量删除大量数据很慢
因为不能用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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
1、删除今天以前的数据,那是说每天凌晨删除昨天数据即可,你一天就1000W?删除也不需要排序,直接delete from table where 。。 limit 1000即可。另外也可以每次删除更少量的数据,避免产生锁,执行频率高一点就行。
2、也可以采用分区的方式,按天分区,每天删除过期分区表