MYSQL 大表删除数据
MYSQL大表删除
1. 选场景选策略
- 整张表的数据全部删除
如果是整张表的数据全部清空、删除,这种场景倒是非常简单,TRUNCATE TABLE肯定是最快的。反而用DELETE处理的话,就是一个糟糕的策略。
- 大表中删除一部分数据
删除大表中绝大部分的数据,但是这个绝大部分怎么定义不好量化,所以我们这里就量化为60%。如果删除的数据比例超过60%,就采用下面方法:
-
新 建表TEST_TMP
-
将要保留的数据转移到TEST_TMP
-
将原表TEST重命名为TEST_OLD, 而将TEST_TMP重命名为TEST
-
检查相关的触发器、约束,进行触发器或约束的重命名
-
核对操作是否正确后,原表(TEST_OLD)要么TRUANCATE后,再DROP掉。要么保留一段时间,保险起见。
删除大表中部分数据,如果比例不超过60%:
-
先删除或禁用无关索引(无关索引,这里指执行计划不用到的索引,这里是指对当前DELETE语句无用的索引)。因为DELETE操作属于DML操作,而且大表的索引一般也非常大,大量DELETE将会对索引进行维护操作,产生大量额外的IO操作。
-
用小批量,分批次删除(批量删除比一次性删除性能要快很多)。不要一次性删除大量数据。一次性删除大量记录。会导致锁的粒度范围很大,并且锁定的时间非常长,而且还可能产生阻塞,严重影响业务等等。而且数据库的事务日志变得非常大。执行的时间变得超长,性能非常糟糕。
2. 准备工作
利用 MYSQL 存储过程向表中添加大量测试数据,示例:
3. 落地实践方案
结合本项目的实际,本次选取方案为分批次删除表中数据,首先查出来满足条件的表中数据总数,对总数与每次删除数进行向上取余,得出需执行 DELETE 次数,最终循环执行删除操作。每次删除总数结合实际进行选取,本案例选取每次删除 1 万条数据。
- 总数方案1
- 总数方案2
- 槽方案
注意:本例中需注意时间异步问题,应当选取 JAVA8 提供的时间操作类。Calendar 类在使用中需开发者自行解决异步问题。
引用:https://blog.csdn.net/weixin_42302384/article/details/114587546?utm_term=calendar线程安全的&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allsobaiduweb~default-6-114587546&spm=3001.4430
测试:此次测试分为本地本机测试与远程数据库服务器测试,其中主要考虑因素为本机与服务器机器性能之间的差异,网络原因不在测试考虑范围内。
以下测试均是批量删除,每次删除数据为 1 万条(本地本机数据库):
亿数据删除十万
亿数据删除百万
千万数据删除十万
千万数据删除百万
百万数据删除十万
每次删除数据为 10 万条(服务器数据库),数据库最大连接时长3分:
百万数据删除十万
千万数据删除十万
八千万数据删除十万
亿数据删除十万
引用:
https://www.jb51.net/article/207999.htm
http://c.biancheng.net/mysql/85/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现