删除记录正确的mysql是_从巨大的MySQL innoDB表中删除记录

我知道这个问题已被问了一百次,但不幸的是,这些答案都没有帮助,因为大多数都是很多年,它应该证明另一个问题的合理性.

我有两个表,140kk行/ 24GB的记录和额外的89kk行/ 70GB.

每个额外的行都有一个与记录的外键关系,索引在两个表之间正确设置.记录中的删除会将删除级联到相关的额外行.

我需要在制作过程中清除旧记录.

运行DELETE FROM记录WHERE WHERE创建< UNIX_TIMESTAMP(DATE_SUB(NOW(),INTERVAL 30天))ORDER BY id LIMIT 1000;需要无休止的(我在20分钟后将它杀死了,它仍处于初始状态).使用SELECT执行相同操作只需几毫秒即可完成. 由于SELECT是那么快我用ID IN(SELECT id子查询^)尝试它,不幸的是没有改变一个东西,所以我在15分钟后杀了它. 由于删除单个记录很快,我最终完成了这项工作:

for i in `seq 1 100000`; do

mysql database -e "SELECT id FROM records WHERE created < UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 30 DAY)) ORDER BY id LIMIT 1000;" | sed 's;/|;;g' | awk '{if(NR>1)print "DELETE FROM records WHERE id = ",$1,";" }' | mysql database;

now=$(date +"%Y/%m/%d %T")

echo "[ $now ] $i.000"

done

这可以在开始时每秒处理一千条记录,但是在几次循环之后它每10-20秒就会下降到一千条记录.由于我需要清除100k行,这需要将近一个月的时间才能完成,这与清除记录的时间差大致相同,因此它永远不会完成(特别是因为有多个数据库需要这样做).

数据库存储在SSD Crucial_CT500MX200SSD1上,软件是带有InnoDB引擎的MariaDB 10.1. innodb_flush_log_at_trx_commit设置为0以避免不必要的磁盘工具.

根据atop瓶颈是磁盘,CPU几乎正在睡眠,大部分内存都在系统缓存中.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值