您好,登錄后才能下訂單哦!
這篇文章主要介紹mysql中delete后加limit好不好,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
在業務場景要求高的數據庫中,對于單條刪除和更新操作,在 delete 和 update 后面加 limit 1 絕對是個好習慣。比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。
那么,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?
在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
delete from t where sex = 1 limit 100;
你或許沒有用過,在一般場景下,我們對 delete 后是否需要加 limit 的問題很陌生,也不知有多大區別!
下面只討論 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\]
「以下面的這條 SQL 為例:」
delete from t where sex = 1;
針對上述第二點,前提是 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 是個值得養成的好習慣。
以上是“mysql中delete后加limit好不好”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。