涨姿势了!delete后加 limit是个好习惯么?
哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号 加星标置顶 ,在此真诚的表示感谢~正文如下:
阅读本文大概需要 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是个好习惯么?相关推荐
- delete后加 limit是个好习惯么 !
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:_陈哈哈 https://blog.csdn.net ...
- delete后加 limit是个好习惯么 ?
点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 来源:r6d.cn/vegm 在业务场景要求高的数据库中,对于单条删除和更 ...
- delete后加 limit是个好习惯么
小伙伴想精准查找自己想看的MySQL文章?喏 → MySQL专栏目录 | 点击这里 在业务场景要求高的数据库中,对于单条删除和更新操作,在delete和update后面加limit 1绝对是个好习惯. ...
- delete 后加 limit
在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯.比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit ...
- CTO说了,delete后不加limit,直接滚蛋!
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:又一程序员进了ICU:压垮一个家庭,一张结算单就够 个人原创100W+访问量博客:点击前往,查看更多 在业务场景 ...
- mysql 恢复delete操作_MySQL 误操作后数据恢复(update,delete忘加where条件)
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者D ...
- mysql 清除分区数据恢复_MySQL 误操作后数据恢复(update,delete忘加where条件)【转】...
在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句 写的有问题导致服务器出问题,导致资源耗尽.最危险的操作就是在做DML操作的时候忘加where条件,导致全表更新,这是作为运维或者 ...
- mysql 修改数据 where_MySQL 误删数据、误更新数据(update,delete忘加where条件)
MySQL 误操作后数据恢复(update,delete忘加where条件) 关键词:mysql误删数据,mysql误更新数据 在数据库日常维护中,开发人员是最让人头痛的,很多时候都会由于SQL语句写 ...
- pageHelper没有正确分页,sql拼接多加limit等参数。
pageHelper没有正确分页,sql拼接多加limit等参数. 背景: 日常敲代码,发现用了pageHelper真的方便,尤其是使用了pageInfo这个类,不用自己写工具类了,直接将所有的页码信 ...
- C++两个 delete 后的问题 野指针
最近在网上看到两个关于指针 delete 后的问题.第一种情况: 1 2 3 int* p = new int; delete p; delete p;// p为什么能delete两次,而程序运行的时 ...
最新文章
- 链表问题3——删除链表的中间节点(初阶)
- Linux-grep命令
- 计算机在能源领域的应用,计算机在能源中的应用
- pg函数同步数据到mysql_将数据从PostgreSQL复制到MySQL
- maven之pom深入
- 梨花带雨html音乐播放器源码,梨花带雨网页悬浮音乐播放器V3开源
- 人人商城源码怎么安装MySQL_人人商城12个常见错误解决方案
- uib-datepicker-popup使用
- hosts文件位置在哪里?(3种打开hosts文件的方法)
- 动画过渡transition
- windows服务器双网卡链路聚合_服务器双网卡捆绑与交换机链路聚合排障1例
- unity 截图/图片保存到手机相册
- Leetcode:125.验证回文串,917仅仅反转字母,387字符串的第一个唯一字符
- Mendix开发介绍实用篇(一)
- java处理1927 12 31_为什么减去这两次(在1927年)给出一个奇怪的结果?
- 初学opencv 2
- PHP在线客服系统源码+H5+APP+搭建教程实例
- AT2657 [ARC078D] Mole and Abandoned Mine
- 图片懒加载(lazyload)的几种方式
- 【Kivy】图形绘制(七)
热门文章
- Python- 索引 B+数 比如书的目录
- 大数据工作由哪几部分组成?
- Ubuntu 12.04安装及配置vsftp步骤
- mkdir() mkdirs() createNewFile
- Python 实int型和list相互转换 现把float型列表转换为int型列表 把列表中的数字由float转换为int型...
- 临时开启PHP错误提示
- 「leetcode」860.柠檬水找零【贪心算法】详细!
- ACDSee Photo Studio 8 for Mac(数字图象处理软件)
- ​​​​iPhone 或 Mac 忘记登录密码,怎么快速找回
- 五分钟了解DOM 事件模型