mysql大表数据清理的利器_使用表分区按天删除数据

张开发
2026/4/15 22:55:38 15 分钟阅读

分享文章

mysql大表数据清理的利器_使用表分区按天删除数据
DROP PARTITION 比 DELETE 快因属元数据操作不扫描行、不写日志、不更新索引而 DELETE 生成大量 undo/redo、锁表久、易致缓冲池雪崩。为什么 DROP PARTITION 比 DELETE 快得多因为 DROP PARTITION 是元数据操作不逐行扫描、不走事务日志、不触发索引更新而 DELETE 会生成大量 undo/redo 日志锁表时间长还可能让缓冲池雪崩。尤其在几十亿行的 orders 表上DELETE FROM orders WHERE dt 2023-01-01 可能跑几小时甚至失败但删一个分区秒级完成。按天分区必须用 RANGE COLUMNS(dt)别用 DATE 函数常见错误是写成 PARTITION BY RANGE (TO_DAYS(dt)) 或 PARTITION BY RANGE (YEAR(dt)*100MONTH(dt)) —— 这会导致 MySQL 无法做 partition pruning查询仍要扫全表。正确做法是ALTER TABLE logs PARTITION BY RANGE COLUMNS(dt) ( PARTITION p20230101 VALUES LESS THAN (2023-01-02), PARTITION p20230102 VALUES LESS THAN (2023-01-03), PARTITION p20230103 VALUES LESS THAN (2023-01-04));dt 字段必须是 DATE 或 DATETIME 类型不能是字符串每个分区上限值写成字符串字面量如 2023-01-02MySQL 才能精确匹配分区名建议带日期方便脚本识别和清理自动删旧分区的脚本要避开 LOCK_WAIT 和元数据锁直接在业务高峰期跑 ALTER TABLE logs DROP PARTITION p20230101 可能被大查询阻塞甚至卡住 DDL 线程。安全做法 Julius AI Julius AI是一款功能强大的AI数据分析工具可以快速分析和可视化复杂数据。

更多文章