回城传送–》《100天精通MYSQL从入门到就业》
文章目录
- 零、前言
- 一、练习题目
- 二、SQL思路:SQL进阶-写优化-删除优化
- 解法
- 删除优化
- 方案一:删除分区表指定分区的所有数据
- 方案二:清空表中的所有数据
- 方案三:清空表中的所有数据第二种实现
- 方案四:delete limit 最佳实践
- 方案五:添加索引
- 方案六:A/B表方案
- 三、总结
- 四、参考
零、前言
今天是学习 SQL 打卡的第 32 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。
希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。
虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。
我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。
今天的学习内容是:SQL进阶-写优化- 删除优化
一、练习题目
题目链接 | 难度 |
SQL进阶-写优化- 删除优化 | ★★★☆☆ |
二、SQL思路:SQL进阶-写优化-删除优化
解法
要求处理:
- 从四个选项中选择一个正确答案
删除优化
方案一:删除分区表指定分区的所有数据
可以使用以下MYSQL语法来删除分区表指定分区的所有数据:
ALTER TABLE table_name DROP PARTITION partition_name;
其中,table_name是您要删除数据的分区表的名称,partition_name是您要删除数据的分区的名称。
注意:通过删除分区的方式删除数据只适用于RANGE分区、LIST分区、RANGE COLUMNS分区和LIST COLUMNS分区。
方案二:清空表中的所有数据
truncate table 它是一条 DDL 语句,它会直接删除表中的所有数据,而不是逐行删除,无法回滚。直接效率很高。
truncate table 表名;
或
truncate 表名;
方案三:清空表中的所有数据第二种实现
drop table 表名;然后删除后重建。速度也很快。
方案四:delete limit 最佳实践
- 在 delete 后加 limit 是个好习惯。原因如下:
- 1、delete from 是全表查找的,如果加上limit 时,删除指定的条数后,就会return了。效率提高不少。
- 2、降低写错 SQL 的代价,即使删错了,例如limit 100,也就删除了100条数据,也能通过binlog找回数据
- 3、避免长事务,delete执行时,涉及的行是会加锁,如果删除的数据量大,那业务功能都要不能用了
- 4、加锁都是基于索引的,如果查询字段没有加索引,那会扫描到主键索引上,那么就算查询出来的只有一条记录,也会锁表
- 5、delete数据量大时,容易占用cpu,导致越删除越慢
- delete limit 最佳实践:
MySQL 大佬丁奇有一道题
如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:
第一种,直接执行 delete from T limit 10000;
第二种,在一个连接中循环执行 20 次 delete from T limit 500;
第三种,在 20 个连接中同时执行 delete from T limit 500。
先说答案:第二种会比较好。
第一种limit 10000 ,单个语句占用的时间长,锁的时间会比较长,会造成长事务问题,影响业务功能的使用。
第三种,20个连接同时执行limit 500,delete 是会加锁的,会造成锁冲突的问题。
总结:delete limit的最佳实践:删除数据时尽量加limit,同时减少加锁的范围,limit的值不要太大。
方案五:添加索引
使用索引:在删除大量数据时,使用索引可以大大提高删除效率。
索引可以帮助数据库快速定位到需要删除的数据行,从而避免了全表扫描的开销。当我们使用 WHERE 子句来限定删除条件时,如果这个条件可以通过索引来匹配,那么数据库就可以直接使用索引来定位到需要删除的数据行,而不需要扫描整个表。这样就可以大大提高删除效率。
方案六:A/B表方案
- 把A表数据复制到一张相同结构的空表B表上。
- 对B表进行业务删除处理
- 重命名原始表,并给新表命名为原始表的原始表名。
- 前提:这个操作要在A表没有写入的时候处理,一般在凌晨。你见过凌晨四点的夜空嘛~
- A/B表方案 银行很多地方有用到这个解决方案,凌晨时跑存储过程
三、总结
本文分享了6种删除优化的方案,没有完美的方案,只有适合的方案。
再来回顾下6种删除优化方案:
- 删除分区表指定分区的所有数据:ALTER TABLE table_name DROP PARTITION partition_name;
- truncate table 清空表中的所有数据
- 先删表再创建,drop table 是清空表中的所有数据第二种实现
- 在 delete 后加 limit ,并给出了最佳实践:删除数据时尽量加limit,同时减少加锁的范围,limit的值不要太大。
- 在删除大量数据时,使用索引
- 使用A/B表方案,注意要在A表没有写入的时候处理。
所以,嗯,这题的答案选。。评论区大声告诉虚竹哥。
四、参考
MySQL进阶技能树–>写优化–>删除优化【第9天】MYSQL进阶-删除记录(SQL 小虚竹)
我是虚竹哥,我们明天见~