MySQL批量删除海量数据怎么操作

📅 2026/7/2 7:49:38
MySQL批量删除海量数据怎么操作
一、删除大表的部分数据一个表有1亿6000万的数据有一个自增ID。最大值就是1亿6000万需要删除大于250万以后的数据有什么办法可以快速删除​ 看到mysql文档有一种解决方案http://dev.mysql.com/doc/refman/5.0/en/delete.html If you are deleting many rows from a large table, you may exceed the lock table size for an InnoDB table. To avoid this problem, or simply to minimize the time that the table remains locked, the following strategy (which does not use DELETE at all) might be helpful: Select the rows not to be deleted into an empty table that has the same structure as the original table: INSERT INTO t_copy SELECT * FROM t WHERE ... ; Use RENAME TABLE to atomically move the original table out of the way and rename the copy to the original name: RENAME TABLE t TO t_old, t_copy TO t; Drop the original table: DROP TABLE t_old; ​删除大表的多行数据时会超出innod block table size的限制最小化的减少锁表的时间的方案是1、选择不需要删除的数据并把它们存在一张相同结构的空表里2、重命名原始表并给新表命名为原始表的原始表名3、删掉原始表二、删除带索引的表在My SQL数据库使用中有的表存储数据量比较大达到每天三百万条记录左右此表中建立了三个索引这些索引都是必须的其他程序要使用。由于要求此表中的数据只保留当天的数据所以每当在凌晨的某一时刻当其他程序处理完其中的数据后要删除该表中昨天以及以前的数据使用delete删除表中的上百万条记录时MySQL删除速度非常缓慢每一万条记录需要大概4分钟左右这样删除所有无用数据要达到八个小时以上这是难以接受的。查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的于是删除掉其中的两个索引后测试发现此时删除速度相当快一百万条记录在一分钟多一些可是这两个索引其他模块在每天一次的数据整理中还要使用于是想到了一个折中的办法在删除数据之前删除这两个索引此时需要三分钟多一些然后删除其中无用数据此过程需要不到两分钟删除完成后重新创建索引因为此时数据库中的数据相对较少约三四十万条记录(此表中的数据每小时会增加约十万条)创建索引也非常快约十分钟左右。这样整个删除过程只需要约15分钟。对比之前的八个小时大大节省了时间。以上做法的意思是1、先删除索引2、删除不需要的数据3、创建索引三、表的删除复习在删除数据的时候根据不同的场景使用不同的方法比如说删除表中部分数据、删除表的结构、删除所有记录并重置自增ID、批量删除大量数据等可以使用delete、truncate、drop等语句。批量删除1) 批量删除少量数据delete from 表名 where key in(值1,...,值n);1、先确定需要删除数据的主键或者条件2、利用主键删除记录。2) 分批删除小批量数据如果你要删除一个表里面的前 10000 行数据有以下三种方法可以做到1、delete from 表名 where 条件 limit 10000;2、在一个连接中循环执行 20 次 delete from 表名 limit 500;3、在 20 个连接中同时执行 delete from 表名 limit 500。三种方法的比较1、一次占用锁的时间比较长可能导致其他客户端一致等待资源。2、分多次占用锁串行化执行不占有锁的间隙其他客户端可以工作。3、自己制造锁竞争加剧并发。可能锁住同一记录导致死锁的可能性增大。--行锁表锁将整个表锁住行锁将表中的某一条记录锁住注意执行大批量删除的时候最好使用limit否则很有可能造成死锁。如果delete的where语句不在索引上可以先找主键然后根据主键删除数据。如果需要删除的数据远远大于不用删除的数据1、先选择不需要删除的数据并把它们存在一张相同结构的空表里2、再重命名原始表并给新表命名为原始表的原始表名3、然后删掉原始表。如果需要删除超大批量数据1、先删除表中索引2、再删除需要删除的数据3、然后重新创建索引。