首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >delete 后加 limit 是个好习惯么?!

delete 后加 limit 是个好习惯么?!

作者头像
芋道源码
发布2020-10-27 11:13:19
1K0
发布2020-10-27 11:13:19
举报
文章被收录于专栏:芋道源码1024芋道源码1024

/qq_39390545/article/details/107519747

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

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

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

delete from t where sex = 1 limit 100;

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

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

下面只讨论删除场景,首先,删除后面是支持极限关键字的,但仅支持指定参数,也就是[limit row_count],用于通知服务器在控制命令被返回到客户端前被删除的行的替代。

删除limit语法如下,尽量的是,必须由必须要和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的代价,就算减少错了,限制500,那也就丢了500条数据,并不致命,通过binlog也可以很快恢复数据。
  • \2。避免了长事务,删除执行时MySQL重置所有涉及的行加写锁和Gap锁(间隙锁),所有DML语句执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。
  • \3。删除数据量大时,不加限制容易把cpu打满,导致越删越慢。

针对上述第二点,通常是性别上加了索引,大家都知道,加锁都是基于索引的,如果sex转换没索引,就会扫描到主键索引上,那么就算sex = 1的只有一条记录,也会锁表。


对于删除限制的使用,MySQL大佬丁奇有些道题:

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

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

--------------------------------------------

杜东:

  • 方案一,事务相对相对,则占用锁的时间缩短,会导致其他客户端等待资源时间缩短。
  • 方案二,串行化执行,将相对长的事务交替多次相对相对的事务,则每次事务占用锁的时间相对相对,其他客户端在等待相应资源的时间也可以。这样的操作,同时也意味着将资源分片使用(每次执行使用不同片段的资源),可以提高并发性。
  • 方案三,人为自己制造锁竞争,加剧并发量。
  • 方案二相对比较好,具体还要结合实际业务场景。

--------------------------------------------

肉山:

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

  • 第一个方案,一次占用的锁时间延长,可能会导致其他客户端一直在等待资源。
  • 第二个方案,分为多次占用锁,串行执行,不占用锁的间隙其他客户端可以工作,交替现在多任务操作系统的时间分片调度,大家分片使用资源,不直接影响使用。
  • 第三个方案,自己制造了锁竞争,加剧并发。

根据选哪一种方案要结合实际场景,综合考虑各个因素吧,某些表的大小,并发量,业务投诉表的依赖程度等。-----------

〜嗡嗡:

  • \1。直接删除10000可能可能执行事务时间过长
  • \2。效率慢点每次循环都是新的短事务,并且不会锁同一条记录,重复执行DELETE知道影响行为0即可
  • \3。效率虽高,但容易锁住同一条记录,发生死锁的可能比较高

-------------------------------------------

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

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

第三种方式(即:在20个连接中同时执行从T限制500中删除),会人为造成锁冲突。

这个例子对我们实践的指导意义就是,在删除数据的时候尝试加限制。这样多个可以控制删除数据的条数,让操作更安全,还可以改变加锁的范围。所以,在删除后加限制是个值得养成的好习惯。

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



本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 芋道源码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 加limit的优点:
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档