0
点赞
收藏
分享

微信扫一扫

【第32天】SQL进阶-写优化- 删除优化(SQL 小虚竹)


回城传送–》《100天精通MYSQL从入门到就业》

文章目录

  • 零、前言
  • 一、练习题目
  • 二、SQL思路:SQL进阶-写优化-删除优化
  • 解法
  • 删除优化
  • 方案一:删除分区表指定分区的所有数据
  • 方案二:清空表中的所有数据
  • 方案三:清空表中的所有数据第二种实现
  • 方案四:delete limit 最佳实践
  • 方案五:添加索引
  • 方案六:A/B表方案
  • 三、总结
  • 四、参考

零、前言

今天是学习 SQL 打卡的第 32 天,每天我会提供一篇文章供群成员阅读( 不需要订阅付钱 )。

希望大家先自己思考,如果实在没有想法,再看下面的解题思路,自己再实现一遍。在小虚竹JAVA社区 中对应的 【打卡贴】打卡,今天的任务就算完成了,养成每天学习打卡的好习惯。

虚竹哥会组织大家一起学习同一篇文章,所以有什么问题都可以在群里问,群里的小伙伴可以迅速地帮到你,一个人可以走得很快,一群人可以走得很远,有一起学习交流的战友,是多么幸运的事情。

我的学习策略很简单,题海策略+ 费曼学习法。如果能把这些题都认认真真自己实现一遍,那意味着 SQL 已经筑基成功了。后面的进阶学习,可以继续跟着我,一起走向架构师之路。

今天的学习内容是:SQL进阶-写优化- 删除优化

一、练习题目

题目链接

难度

SQL进阶-写优化- 删除优化

★★★☆☆

二、SQL思路:SQL进阶-写优化-删除优化

【第32天】SQL进阶-写优化- 删除优化(SQL 小虚竹)_sql


【第32天】SQL进阶-写优化- 删除优化(SQL 小虚竹)_sql_02

解法

要求处理:

  • 从四个选项中选择一个正确答案

删除优化

方案一:删除分区表指定分区的所有数据

可以使用以下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 小虚竹)

我是虚竹哥,我们明天见~


举报

相关推荐

0 条评论