安全删除需分批、索引、游标分页:WHERE条件字段必须有有效索引,用id主键游标替代LIMIT,单批1000~5000行并休眠,避免fetchall全量加载。DELETE 语句不加 LIMIT 就直接崩库?线上环境执行 DELETE FROM users WHERE status = 'inactive' 这种语句,极大概率触发锁表、主从延迟、甚至 OOM。MySQL 默认事务下,全表扫描+逐行加锁+生成大量 undo log,不是删数据,是给数据库做心肺复苏。真正安全的做法是分批、带索引条件、控制每批大小和间隔:必须确保 WHERE 条件字段有有效索引(比如 status 单独无索引,但 (status, id) 联合索引可用)用 id 或自增主键做游标分页,比 LIMIT offset, size 更稳定(避免 offset 越大越慢)单批建议 1000~5000 行,太小效率低,太大锁时间长;每批后 SLEEP(0.1) 或更久,给复制和缓冲池喘息机会别信"先 SELECT 再 DELETE"------中间可能有新数据写入,要用 SELECT ... FOR UPDATE 或原子性子查询兜底Python 脚本怎么安全跑完十万行删除?用 mysql-connector-python 或 pymysql 写循环时,最容易犯的错是:把整个结果集一次性 fetchall() 到内存,或者没关游标/连接,脚本跑一半就报 MySQL Server has gone away。正确姿势是流式处理 + 显式事务控制:每次只查一批待删 id:SELECT id FROM logs WHERE created_at 拿到这批 id 后,用 DELETE FROM logs WHERE id IN (1,2,3,...) 删除(注意 IN 列表长度别超 max_allowed_packet)每次删完立刻 conn.commit(),不要攒事务;出错时捕获 pymysql.err.IntegrityError 等并跳过异常 ID记录最后成功删除的 id 到临时文件或数据库,断点续删才靠谱mysqldump + truncate 不如直接用 pt-archiver有人想导出再清空,或者用 TRUNCATE TABLE 图快------但 TRUNCATE 是 DDL,会锁整表、重置 AUTO_INCREMENT、且无法加 WHERE 条件;mysqldump --where 导出再删,IO 和磁盘压力反而更大。 Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西
相关推荐
猫咪很可爱6 分钟前
Oracle TEMP 表空间不足(ORA-01652)问题分析与优化实践外收内放22 分钟前
面向对象高级(实战案例)专业程序开发源1 小时前
springboot欧缇蔓月子中心管理系统82697-计算机课程设计、毕业设计FPGA小迷弟1 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南卷无止境1 小时前
面向arm64桌面客户端开发全景:语言、框架与生态九零HTTP1 小时前
10月21号-CSDN配菜-IP池的5个坑fanruitian1 小时前
python else用法Data-Miner2 小时前
需要做财务数据分析,有什么好用的工具?从准备到出报告的实操指南Thinker QAQ2 小时前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用用户8356290780512 小时前
如何使用 Python 对 Excel 数据进行分组和分级显示