点击上方“芋道源码”,选择“”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

来源:////

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

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

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

delete from t where sex = 1 limit 100;

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

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

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

删除limit语法如下,尽量的是,必须由必须要和limit联用,否则就会被优化掉。

delete [low_priority] [quick] [ignorefrom tbl_name
  [where ...]
    [order by ...]
      [limit row_count]

加limit的优点:

以下面的这条SQL可能:

delete from t where sex = 1;

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

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

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

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

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

杜东:

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

肉山:

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

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

〜嗡嗡:

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

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

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

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

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

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

欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 2.X 入门》系列delete语句,已经 20 余篇,覆盖了、Redis、、ES、分库分表、读写分离、、、权限、、Dubbo、、、Kafka、性能测试等等内容。

提供近 3W 行代码的 示例,以及超 4W 行代码的电商微服务项目。


限时特惠:
本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情

站长微信:Jiucxh

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注