哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号 加星标置顶 ,在此真诚的表示感谢~正文如下:

阅读本文大概需要 4 分钟。

作者:_陈哈哈

来源:blog.csdn.net/qq_39390545/article/details/107519747

在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯。比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,否则还会执行完全表扫描才 return。效率不言而喻。

那么,在日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢?

在日常的 SQL 编写中,你写 delete 语句时是否用到过以下 SQL?

delete from t where sex = 1 limit 100; 

你或许没有用过,在一般场景下,我们对 delete 后是否需要加 limit 的问题很陌生,也不知有多大区别,今天带你来了解一下,记得 mark!

写在前面,如果是清空表数据建议直接用 truncate,效率上 truncate 远高于 delete,应为 truncate 不走事务,不会锁表,也不会生产大量日志写入日志文件;truncate table table_name 后立刻释放磁盘空间,并重置 auto_increment 的值。delete 删除不释放磁盘空间,但后续 insert 会覆盖在之前删除的数据上。详细了解请跳转另一篇博文《delete、truncate、drop 的区别有哪些,该如何选择》

下面只讨论 delete 场景,首先,delete 后面是支持 limit 关键字的,但仅支持单个参数,也就是 [limit row_count],用于告知服务器在控制命令被返回到客户端前被删除的行的最大值。

delete limit 语法如下,值得注意的是,order by 必须要和 limit 联用,否则就会被优化掉。

delete \[low\_priority\] \[quick\] \[ignore\] from tbl\_name\[where ...\]\[order by ...\]\[limit row\_count\]

加 limit 的的优点:

「以下面的这条 SQL 为例:」

delete from t where sex = 1; 
  • 1. 降低写错 SQL 的代价,就算删错了,比如 limit 500, 那也就丢了 500 条数据,并不致命,通过 binlog 也可以很快恢复数据。

  • 2. 避免了长事务,delete 执行时 MySQL 会将所有涉及的行加写锁和 Gap 锁(间隙锁),所有 DML 语句执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。

  • 3. delete 数据量大时,不加 limit 容易把 cpu 打满,导致越删越慢。

针对上述第二点,前提是 sex 上加了索引,大家都知道,「加锁都是基于索引的,如果 sex 字段没索引,就会扫描到主键索引上,那么就算 sex = 1 的只有一条记录,也会锁表。」

「对于 delete limit 的使用,MySQL 大佬丁奇有一道题:」

如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:第一种,直接执行 delete from T limit 10000; 第二种,在一个连接中循环执行 20 次 delete from T limit 500; 第三种,在 20 个连接中同时执行 delete from T limit 500。

你先考虑一下,再看看几位老铁的回答:

「Tony Du:」

  • 方案一,事务相对较长,则占用锁的时间较长,会导致其他客户端等待资源时间较长。

  • 方案二,串行化执行,将相对长的事务分成多次相对短的事务,则每次事务占用锁的时间相对较短,其他客户端在等待相应资源的时间也较短。这样的操作,同时也意味着将资源分片使用(每次执行使用不同片段的资源),可以提高并发性。

  • 方案三,人为自己制造锁竞争,加剧并发量。

  • 方案二相对比较好,具体还要结合实际业务场景。

「肉山:」

不考虑数据表的访问并发量,单纯从这个三个方案来对比的话。

  • 第一个方案,一次占用的锁时间较长,可能会导致其他客户端一直在等待资源。

  • 第二个方案,分成多次占用锁,串行执行,不占有锁的间隙其他客户端可以工作,类似于现在多任务操作系统的时间分片调度,大家分片使用资源,不直接影响使用。

  • 第三个方案,自己制造了锁竞争,加剧并发。

至于选哪一种方案要结合实际场景,综合考虑各个因素吧,比如表的大小,并发量,业务对此表的依赖程度等。

「~嗡嗡:」

  • 1. 直接 delete 10000 可能使得执行事务时间过长

  • 2. 效率慢点每次循环都是新的短事务,并且不会锁同一条记录,重复执行 DELETE 知道影响行为 0 即可

  • 3. 效率虽高,但容易锁住同一条记录,发生死锁的可能性比较高

怎么删除表的前 10000 行。比较多的朋友都选择了第二种方式,即:在一个连接中循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。

第一种方式(即:直接执行 delete from T limit 10000)里面,单个语句占用时间长,锁的时间也比较长;而且大事务还会导致主从延迟。

第三种方式(即:在 20 个连接中同时执行 delete from T limit 500),会人为造成锁冲突。

这个例子对我们实践的指导意义就是,在删除数据的时候尽量加 limit。这样不仅可以控制删除数据的条数,让操作更安全,还可以减小加锁的范围。所以,在 delete 后加 limit 是个值得养成的好习惯。

好了,本文就带你了解这些,如果有相关疑问和好想法,请在下方留言,方便和小伙伴儿们一起讨论。

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

涨姿势了!delete后加 limit是个好习惯么?相关推荐

  1. delete后加 limit是个好习惯么 !

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:_陈哈哈 https://blog.csdn.net ...

  2. delete后加 limit是个好习惯么 ?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6d.cn/vegm 在业务场景要求高的数据库中,对于单条删除和更 ...

  3. delete后加 limit是个好习惯么

    小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里 在业务场景要求高的数据库中,对于单条删除和更新操作,在delete和update后面加limit 1绝对是个好习惯. ...

  4. delete 后加 limit

    在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯.比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit ...

  5. CTO说了,delete后不加limit,直接滚蛋!

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:又一程序员进了ICU:压垮一个家庭,一张结算单就够 个人原创100W+访问量博客:点击前往,查看更多 在业务场景 ...

  6. mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...

  7. mysql 清除分区数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)【转】...

    在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...

  8. mysql 修改数据 where_MySQL 误删数据、误更新数据(update,delete忘加where条件)

    MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写 ...

  9. pageHelper没有正确分页,sql拼接多加limit等参数。

    pageHelper没有正确分页,sql拼接多加limit等参数. 背景: 日常敲代码,发现用了pageHelper真的方便,尤其是使用了pageInfo这个类,不用自己写工具类了,直接将所有的页码信 ...

  10. C++两个 delete 后的问题 野指针

    最近在网上看到两个关于指针 delete 后的问题.第一种情况: 1 2 3 int* p = new int; delete p; delete p;// p为什么能delete两次,而程序运行的时 ...

最新文章

  1. 链表问题3——删除链表的中间节点(初阶)
  2. Linux-grep命令
  3. 计算机在能源领域的应用,计算机在能源中的应用
  4. pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
  5. maven之pom深入
  6. 梨花带雨html音乐播放器源码,梨花带雨网页悬浮音乐播放器V3开源
  7. 人人商城源码怎么安装MySQL_人人商城12个常见错误解决方案
  8. uib-datepicker-popup使用
  9. hosts文件位置在哪里?(3种打开hosts文件的方法)
  10. 动画过渡transition
  11. windows服务器双网卡链路聚合_服务器双网卡捆绑与交换机链路聚合排障1例
  12. unity 截图/图片保存到手机相册
  13. Leetcode:125.验证回文串,917仅仅反转字母,387字符串的第一个唯一字符
  14. Mendix开发介绍实用篇(一)
  15. java处理1927 12 31_为什么减去这两次(在1927年)给出一个奇怪的结果?
  16. 初学opencv 2
  17. PHP在线客服系统源码+H5+APP+搭建教程实例
  18. AT2657 [ARC078D] Mole and Abandoned Mine
  19. 图片懒加载(lazyload)的几种方式
  20. 【Kivy】图形绘制(七)

热门文章

  1. Python- 索引 B+数 比如书的目录
  2. 大数据工作由哪几部分组成?
  3. Ubuntu 12.04安装及配置vsftp步骤
  4. mkdir() mkdirs() createNewFile
  5. Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型...
  6. 临时开启PHP错误提示
  7. 「leetcode」860.柠檬水找零【贪心算法】详细!
  8. ACDSee Photo Studio 8 for Mac(数字图象处理软件)
  9. ​​​​iPhone 或 Mac 忘记登录密码,怎么快速找回
  10. 五分钟了解DOM 事件模型