delete後加 limit是個好習慣麼 !

2021-03-02 碼農突圍

點擊上方「碼農突圍」,馬上關注

這裡是碼農充電第一站,回復「666」,獲取一份專屬大禮包

真愛,請設置「星標」或點個「在看」

作者:_陳哈哈

https://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 是個值得養成的好習慣。

好了,本文就帶你了解這些,如果有相關疑問和好想法,請在下方留言,方便和小夥伴兒們一起討論。

最近有有不少老鐵在後臺留言說,想進大廠,但是算法不好。最近我整理了一份刷題實錄,這份刷題實錄,也讓我進了心儀的大廠。現在開放分享給大家。希望對大家有所幫助。

任何的算法題,如同寫作文一樣,都有一些模板可以套用的。比如面試常考的DP(動態規劃),難的是一些關鍵點是否能想清楚。比如你能寫出動態轉移方程,這題基本上就可以AC了。

整個刷題實錄內容,包括 雙子針、動態規劃、二分查找、貪心算法、深度優先搜索、字符串、遞歸、字典樹、排序、鍊表等相關專題內容。圖文並茂,附有刷題答案源碼。

刷題任務的題目,是根據題目的類型來匯總的,總結了八個類別,每個類別下面也總結了5個左右的題型,幫助大家分門別類的突破,所以刷起來相對會更有重點和針對性。如果從頭到尾的刷,每周按順序刷42題,很容易讓自己堅持不下來,也會覺得很枯燥。所以在制定計劃的時候可以讓這個計劃變得更「有趣"和針對性,讓它看起來更容易實現一點,才會更容易堅持。

目前上述內容已打包成完整電子書,具體獲取方式如下:

掃描關注 Github愛好者社區 公眾號;

Github愛好者社區 公眾號後臺回復關鍵詞「9999」獲取下載地址。

掃描關注,回復"9999"即可下載

相關焦點

  • 資料庫中 truncate與delete的區別你了解多少?
    當然 也可加上條件 方括號的可填條件如:delete LOW_PRIORITY QUICK IGNORE from a where id>2 order by id limit 1;(表示刪掉a表中數據按id升序排列後,id大於2的一條數據。)
  • malloc/free與new/delete的區別
    由於malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加malloc/free。二、在用法上也有所不同。例如delete []objects;  delete objects;  後者相當於delete objects[0],漏掉了另外99 個對象。
  • MySQL恢復delete的數據
    如果沒有完整的把資料庫或者表刪除掉,而僅僅是刪除了表裡的部分數據,比如本文探討的:delete命令數據誤刪恢復,這種情況應該發生的概率更大,畢竟有機會刪除庫和表的權限和命令通常控制的都很嚴(刪庫跑路是段子)。有人會有疑惑,用delete命令去刪除數據,不都是正常想刪除掉的麼,為何存在要恢復的情況。
  • 經典的士高 雄霸35個國家排行榜冠軍單曲——No Limit
    No limit中文為《無限的士高》是由荷蘭的二人跳舞組合2 Unlimited「二人無極」演唱的歌曲。
  • 寶馬limit燈什麼意思
    【太平洋汽車網】寶馬limit燈指的是汽車的限速。如果limit燈亮,說明汽車正在進行限速提示,可能是車主不小心按到了限速鍵,汽車就開始進行警報,這個功能在設置裡是可以關掉的,假如說汽車設置的限速為80km/h,當汽車的車速超過設定值時,limit燈就會報警。
  • Linux下malloc/free與new/delete的區別
    1、malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們都可用於申請動態內存和釋放內存。  2、對於非內部數據類型的對象而言,光用maloc/free無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數,對象在消亡之前要自動執行析構函數。
  • 「刪除好友」不是"delete"!正確的表達是...
    新東方網>英語>英語學習>口語>實用口語>正文「刪除好友」不是"delete"!正確的表達是...   「刪除」好友的英語真不是delete哦~!   01 刪除好友 Unfriend   在臉書這些常見的社交媒體上,「刪除好友」有常用的詞語叫unfriend。   而delete則是指在系統中刪除某些條目,比如刪除文件、歌曲、電話號碼、聯繫方式、郵件等。
  • 為什麼MySQL不建議delete刪除數據
    罵歸罵,事情還是得解決,時候我分析原因發現,發現有些表的數據量增長很快,對應SQL掃描了很多無效數據,導致SQL慢了下來,通過確認之後,這些大表都是一些流水、記錄、日誌類型數據,只需要保留1到3個月,此時需要對表做數據清理實現瘦身,一般都會想到用insert + delete的方式去清理。
  • 小心避坑:MySQL分頁時使用 limit+order by 會出現數據重複問題
    1、問題描述在MySQL中我們通常會採用limit來進行翻頁查詢,比如limit(0,10)表示列出第一頁的10條數據,limit(10,10)表示列出第二頁。但是,當limit遇到order by的時候,可能會出現翻到第二頁的時候,竟然又出現了第一頁的記錄。
  • Win7系統如何禁用Ctrl+Alt+delete?
    Ctrl+Alt+delete這個組合鍵想必大家不會陌生,這個是用來打開任務管理器的,通常我們想查看系統後臺在運行哪些程序的時候,會使用它來進行查看。但是有些用戶不喜歡用這個組合鍵,想把它禁用了,卻不知如何進行。
  • 【轉載】深入理解 JavaScript 中的 delete 操作符
    似乎很多同學(包括我)對 delete 操作符都是似是而非,為什麼有的屬性可以被刪除,有的卻不能被刪除?為什麼能夠刪除對象的屬性卻不能刪除變量或函數?在 eval 和 嚴格模式下,delete 操作符又有哪些特性?等等。。本文將從基本概念到 ECMPScript 內部原理來學習 delete 操作符。
  • MySQL中order by與limit不要一起用!
    ②如果你將 LIMIT row_count 子句與 ORDER BY 子句組合在一起使用的話,MySQL 會在找到排序結果的第一個 row_count 行後立即停止排序,而不是對整個結果進行排序。如果使用索引來完成排序,這將非常快。
  • 起床後保持5個好習慣,減脂速度提速,2個月暴瘦10斤
    第一個好習慣、起床後先喝下一杯暖開水 早起後,身體的血液比較粘稠,此時身體的內臟器官還沒有開始運轉,血液的供氧能力較弱,而這時一杯水能夠有效地解決這些問題,稀釋粘稠的血液,提高身體的血液循環和流動,提高血液中的供氧能力,並且喚醒內臟器官(比如腸胃)開始運轉,更好地吸收早餐的營養。
  • 親,加個微信吧!|對不起,我可以不加麼?
    可是我們真的需要那麼多所謂的「朋友」麼?可是上面的對話就真的是我們想說的麼?其實,有時候,我真他媽想說:-親,加個微信吧!-對不起,我可以不加麼?意淫一下說出來好(dan)爽(xin)的感覺,但意淫歸意淫,到現在為止,我從來木有說出口過。
  • 魔獸世界:H團本強度過高,凱爾薩斯卡住大量公會,limit滅到散
    WLC新團本進度數據9.0版本新團本納斯利亞堡中一共有10個BOSS,而目前從WCL上可以看到的最高進度僅僅打了3個BOSS,絕大部分公會團還卡在3號BOSS凱爾薩斯。開荒進度只有30%,可見這個新團本的難度有多麼的高了。
  • 盤點蘋果Mac電腦Delete鍵的5種用法
    Mac電腦Delete鍵的5種用法  第一種:按 delete 鍵,實現 Windows 鍵盤上退格鍵的功能,也就是刪除光標之前的一個字符(默認);  第二種:按 fn+delete 鍵,刪除光標之後的一個字符
  • MySQL中delete和update語句的用法
    昨天和大家分享學習了insert,今天我們一起學習一下刪除與更新,即delete和update的用法。UPDATE 表名 SET 屬性名1=取值1, 屬性名2=取值2,…,屬性名n=取值nWHERE 條件表達式;2、刪除記錄語法:DELETE FROM 表名 [ WHERE 條件表達式 ] ;刪除記錄,也是一樣,需要加上where條件,不然則是將整個表格記錄全部刪除的;現在來實際敲幾個案例
  • 面試官靈魂一問:MySQL 的 delete、truncate、drop 有什麼區別?
    from TABLE_NAME where xxx1、DELETE屬於資料庫DML操作語言,只刪除數據不刪除表的結構,會走事務,執行時會觸發trigger;2、在 InnoDB 中,DELETE其實並不會真的把數據刪除,mysql 實際上只是給刪除的數據打了個標記為已刪除
  • MySQL 中 delete、truncate、drop 關鍵字的區別有哪些,該如何選擇?
    truncate >> DELETE二、從原理上講1、DELETEDELETEfrom TABLE_NAME where xxx1)DELETE屬於資料庫DML操作語言,只刪除數據不刪除表的結構,會走事務,執行時會觸發trigger;2)在 InnoDB 中,DELETE其實並不會真的把數據刪除,mysql 實際上只是給刪除的數據打了個標記為已刪除
  • 買東西備註是個好習慣
    沒必要帶節奏,真果粒不止我們還有趙麗穎和王俊凱等眾多明星,買東西備註真是個好習慣!