delete后加 limit是个好习惯么?
点击关注上方“SQL数据库开发”,
设为“置顶或星标”,第一时间送达干货
delete from t where sex = 1 limit 100;
写在前面,如果是清空表数据建议直接用 truncate,效率上 truncate 远高于 delete,应为 truncate 不走事务,不会锁表,也不会生产大量日志写入日志文件;truncate table table_name 后立刻释放磁盘空间,并重置 auto_increment 的值。delete 删除不释放磁盘空间,但后续 insert 会覆盖在之前删除的数据上。详细了解请跳转另一篇博文《delete、truncate、drop 的区别有哪些,该如何选择》
delete \[low\_priority\] \[quick\] \[ignore\] from tbl\_name
\[where ...\]
\[order by ...\]
\[limit row\_count\]
加 limit 的的优点:
delete from t where sex = 1;
1. 降低写错 SQL 的代价,就算删错了,比如 limit 500, 那也就丢了 500 条数据,并不致命,通过 binlog 也可以很快恢复数据。 2. 避免了长事务,delete 执行时 MySQL 会将所有涉及的行加写锁和 Gap 锁(间隙锁),所有 DML 语句执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。 3. delete 数据量大时,不加 limit 容易把 cpu 打满,导致越删越慢。
如果你要删除一个表里面的前 10000 行数据,有以下三种方法可以做到:
第一种,直接执行 delete from T limit 10000;
第二种,在一个连接中循环执行 20 次 delete from T limit 500;
第三种,在 20 个连接中同时执行 delete from T limit 500。
方案一,事务相对较长,则占用锁的时间较长,会导致其他客户端等待资源时间较长。 方案二,串行化执行,将相对长的事务分成多次相对短的事务,则每次事务占用锁的时间相对较短,其他客户端在等待相应资源的时间也较短。这样的操作,同时也意味着将资源分片使用(每次执行使用不同片段的资源),可以提高并发性。 方案三,人为自己制造锁竞争,加剧并发量。 方案二相对比较好,具体还要结合实际业务场景。
肉山:
不考虑数据表的访问并发量,单纯从这个三个方案来对比的话。
第一个方案,一次占用的锁时间较长,可能会导致其他客户端一直在等待资源。 第二个方案,分成多次占用锁,串行执行,不占有锁的间隙其他客户端可以工作,类似于现在多任务操作系统的时间分片调度,大家分片使用资源,不直接影响使用。 第三个方案,自己制造了锁竞争,加剧并发。
-------------------------------------------
~嗡嗡:
1. 直接 delete 10000 可能使得执行事务时间过长 2. 效率慢点每次循环都是新的短事务,并且不会锁同一条记录,重复执行 DELETE 知道影响行为 0 即可 3. 效率虽高,但容易锁住同一条记录,发生死锁的可能性比较高
作者:_陈哈哈
https://blog.csdn.net/qq_39390545/article/details/107519747
——End——
后台回复关键字:1024,获取一份精心整理的技术干货 后台回复关键字:进群,带你进入高手如云的交流群。 推荐阅读 这是一个能学到技术的公众号,欢迎关注
点击「阅读原文」了解SQL训练营
评论