今天来讲讲关于大表删除 的问题。
比如,你现在需要删除一张一共有 5 亿数据的表里面的 2021 年数据,假设这张表叫 yes。
我相信你脑子在 1s 内肯定会蹦出这条 sql :
delete from yes where create_date > 2020-12-31 and create_date 2020-12-31 and create_date 2020-12-31 and create_date = 2021-02-01 and create_date = 233333333 and id 2020-12-31 and create_date = 233433333 and id 2020-12-31 and create_date = 666566666 and id 2020-12-31 and create_date < 2022-01-01;
当然你也可以再精确些,通过日期筛选来得到 maxid,这影响不大(不满足条件的 sql 执行很快,不会耗费很多时间)。
这样一来 sql 就满足了分批的操作,且用得上索引。
如果哪条语句执行出错,只会回滚小部分数据,我们重新排查下就好了,影响不大。
而且拆分 sql 之后还可以并行提高执行效率 。
当然,并行可能有锁竞争的情况,导致个别语句等待超时。不过影响不大,只要机器状态好,执行得快,因为锁竞争导致的等待并不一定会超时,如果个别 sql 超时的话,重新执行就好了。
有时候要转换思路
关于大表删除有时候要转换思路,把删除转成插入 。
假设还是有一张 5 亿的数据表,此时你需要删除里面 4.8 亿的数据,那这时候就不要想着删除了,要想着插入。
道理很简单,删除 4.8 亿的数据,不如把要的 2000w 插入到新表中,我们后面业务直接用新表就好了。
这两个数据量对比,时间效率差异不言而喻了吧?
具体操作也简单:
创建一张新表,名为 yes_temp;
将 yes 表的 2000w 数据 select into 到 yes_temp 中;
将 yes 表 rename 成 yes_233;
将 yes_temp 表 rename 成 yes。
狸猫换太子,大功告成啦!
之前有个记录表我们就是这样操作的,就 select into 近一个月的数据到新表中,以前老数据就不管了,然后 rename 一下,执行得非常快。
本来预估 2 小时的 sql 操作,1 分钟就搞定了。
这种类似的操作是有工具的,比如 pt-online-schema-change 等,不过我没用过,有兴趣的小伙伴可以自己去看看,道理是一样的,多了几个触发器,这里不多赘述了。
最后
咱们开发还是得多学一些数据库的操作和原理,因为好多数据库的操作都需要亲力亲为,小公司没 dba 的话就不说了,大公司的话咱也不知道 dba 到底会关心到哪个程度,还是得靠自己靠谱。
苹果 Apple TV 设备明年发布:配备 A12 和 A14 芯片
北斗卫星导航系统再立新功!
PCB布局及焊接层面上也同时能够照顾芯片的散热一些小贴士
ios10.3 beta2刚推送就出现有史以来最任性bug,你们发现了吗?
美谷分子举办CellXpress.ai全自动一体化类器官工作站新品发布会
讲讲关于SQL大表删除的问题
实现真正的无线电力技术的承诺
雷达流量计三合一(5000+)
十款经典联轴器的动图分享
成本优势+特种工艺, 8寸晶圆厂竞争优势显著
到底什么是数字孪生?有哪些具体应用呢
受下游需求放缓影响工业机器人销量下降
华为P40的4G全网通上架京东商城
2020年哪些企业跨界无人机领域?
反无人机系统有哪些检测技术
AI领域的10大里程碑
黑莓KEY2评测 面向商务市场的中高端机型
选择靠谱的电源管理ic芯片厂家有什么特点
市场宠儿LED透明屏,用时尚与科技演绎一生
怎样选择电源自动测试系统才能不踩坑?