Mysql百万数据的批量删除

假设有一个表(student)有1000万条记录,需要在业务不

停止的情况下删除其中statusid=1的所有记录,差不多


有600万条, 直接执行 DELETE FROM student WHERE statusid=1 

会发现删除失败,因为lock wait timeout exceed的错误。

 
因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数

分批删除,比如每10000条进行一次删除,那么我们可以利用 

MySQL这样的语句来完成

 

DELETE FROM student WHERE status=1 ORDER BY statusid LIMIT 10000;

然后分多次执行就可以把这些记录成功删除。
### MySQL批量删除多条记录的语法示例 在MySQL中,`DELETE FROM`语句可以通过多种方式实现批量删除。以下是几种常见的方法及其具体应用。 #### 方法一:基于条件的批量删除 通过指定 `WHERE` 条件来删除符合条件的所有记录。这种方法适用于需要一次性删除特定范围内的数据的情况[^1]。 ```sql DELETE FROM tbl_name WHERE where_definition; ``` 例如,假设有一个名为 `users` 的表,其中存储了大量的用户信息,现在希望删除年龄大于等于50岁的所有用户: ```sql DELETE FROM users WHERE age >= 50; ``` 此命令会删除所有满足 `age >= 50` 条件的记录,并返回被删除的记录数。 --- #### 方法二:分批次删除数据集 当需要删除大量的记录时,直接使用单一的 `DELETE` 语句可能导致性能下降甚至锁定表资源。为了避免这种情况,可以采用分批删除的方式[^2]。 以下是一个典型的分批删除脚本示例: ```sql SET @done = 0; WHILE @done = 0 DO DELETE FROM users WHERE condition LIMIT 1000; -- 每次只删除1000条记录 SET @done = ROW_COUNT(); -- 如果本次删除影响的行数为0,则结束循环 END WHILE; ``` 上述脚本通过设置每次删除的最大行数(如1000),逐步完成整个删除过程,从而减少单次操作的压力并提升整体性能。 --- #### 方法三:利用子查询进行复杂条件下的批量删除 有时可能需要根据另一个表的数据或者复杂的逻辑来进行删除操作。此时可以借助子查询来构建更灵活的 `WHERE` 条件[^3]。 例如,假设有两个表 `orders` 和 `customers`,我们想删除那些在过去一年没有任何订单的客户: ```sql DELETE FROM customers WHERE customer_id NOT IN ( SELECT DISTINCT order_customer_id FROM orders WHERE order_date > DATE_SUB(CURDATE(), INTERVAL 1 YEAR) ); ``` 这条语句先通过子查询找出过去一年有订单的客户ID列表,再将其排除在外以删除剩余的目标客户记录。 --- #### 方法四:多表联合删除 如果涉及多个表之间的关联关系,在某些情况下可以直接在一个 `DELETE` 语句中处理跨表的操作[^5]。 下面展示了一个例子,说明如何同时从两张或多张表中移除相关联的信息: ```sql -- 方式A (FROM 删除法) DELETE a, b FROM table_a AS a INNER JOIN table_b AS b ON a.id = b.a_id WHERE some_condition; -- 方式B (USING 删除法) DELETE FROM a USING table_a AS a INNER JOIN table_b AS b ON a.id = b.a_id WHERE some_condition; ``` 这两种写法都可以达到相同的效果——即依据两表间的连接规则同步清理掉对应的冗余项。 --- #### 性能优化建议 为了进一步改善大规模删除场景下的表现效果,还可以考虑以下几个方面[^4]: - **合理运用索引**:确保所使用的字段已建立适当类型的索引; - **避免全表扫描**:始终明确提供精确的过滤条件; - **控制事务大小**:将大任务拆分为若干个小单元提交; - **尝试 TRUNCATE 替代方案**:若目标是清空整张表格而非部分记录,则优先选用更快捷高效的 `TRUNCATE TABLE` 命令代替常规 `DELETE`。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值