面試被問delete後有必要加 limit麼 ?

2021-03-02 程式設計師面試

作者:_陳哈哈

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 的的優點:

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。----方案一,事務相對較長,則佔用鎖的時間較長,會導致其他客戶端等待資源時間較長。方案二,串行化執行,將相對長的事務分成多次相對短的事務,則每次事務佔用鎖的時間相對較短,其他客戶端在等待相應資源的時間也較短。這樣的操作,同時也意味著將資源分片使用(每次執行使用不同片段的資源),可以提高並發性。----
肉山:
不考慮數據表的訪問並發量,單純從這個三個方案來對比的話。第一個方案,一次佔用的鎖時間較長,可能會導致其他客戶端一直在等待資源。第二個方案,分成多次佔用鎖,串行執行,不佔有鎖的間隙其他客戶端可以工作,類似於現在多任務作業系統的時間分片調度,大家分片使用資源,不直接影響使用。至於選哪一種方案要結合實際場景,綜合考慮各個因素吧,比如表的大小,並發量,業務對此表的依賴程度等。
---
~嗡嗡: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 是個值得養成的好習慣。

版權申明:內容來源網絡,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。祝願每一位讀者生活愉快!謝謝!

↑↑↑掃碼回復 程式設計師 有彩蛋↑↑↑

相關焦點

  • delete後加 limit是個好習慣麼 !
    比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。那麼,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
  • 不懂就問:delete 後加 limit 是個好習慣麼 ?
    比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。那麼,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
  • delete後加 limit是個好習慣麼 ?
    比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。那麼,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
  • delete後加 limit是個好習慣麼?
    比如,在刪除執行中,第一條就命中了刪除行,如果 SQL 中有 limit 1;這時就 return 了,否則還會執行完全表掃描才 return。效率不言而喻。那麼,在日常執行 delete 時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?在日常的 SQL 編寫中,你寫 delete 語句時是否用到過以下 SQL?
  • delete後加 limit是個好習慣麼
    和update後面加limit 1絕對是個好習慣。比如,在刪除執行中,第一條就命中了刪除行,如果SQL中有limit 1;這時就return了,否則還會執行完全表掃描才return。效率不言而喻。那麼,在日常執行delete時,我們是否需要養成加 limit 的習慣呢?是不是一個好習慣呢?
  • delete 後加 limit 是個好習慣麼?!
    在業務場景要求高的資料庫中,對於單條刪除和更新操作,在刪除和更新後加限制1絕對是個好習慣。這樣,在刪除執行中,第一條就命中了刪除行,如果SQL中有限制1;這時就return了,否則將會執行完全表掃描才ret urn。效率不言而喻。
  • 面試官靈魂一問:MySQL 的 delete、truncate、drop 有什麼區別?
    二、從原理上講1、DELETE2、truncate3、drop上周同事小姐姐問我:「哥你看,我發現MySQL有bug,我下午為了清理磁碟,明明刪除了100萬條MySQL數據,磁碟不僅沒有變小,反而更滿了呢??」
  • 面試被問到SQL | delete、truncate、drop 有什麼區別?
    同樣也是一個班,他只去除所有的學生.班還在,職務還在,如果有新增的學生可以進去,也可以分配上職務刪除內容很容易理解,不刪除定義也很容易理解,就是保留表的數據結構delete  tb where 條件絕招:刪除內容不刪除定義,不釋放空間。
  • 資料庫中 truncate與delete的區別你了解多少?
    當然 也可加上條件 方括號的可填條件如:delete LOW_PRIORITY QUICK IGNORE from a where id>2 order by id limit 1;(表示刪掉a表中數據按id升序排列後,id大於2的一條數據。)
  • 面試題:Mysql中drop、delete與truncate有什麼區別?
    當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。(3) 一般而言,drop > truncate > delete(4) 應用範圍。
  • 【219期】面試官:談談MySQL的limit用法、邏輯分頁和物理分頁
    物理分頁為什麼用limit在講解limit之間,我們先說說分頁的事情。分頁有邏輯分頁和物理分頁,就像刪除有邏輯刪除和物理刪除。邏輯刪除就是改變資料庫的狀態,物理刪除就是直接刪除資料庫的記錄,而邏輯刪除只是改變該資料庫的狀態。
  • delete 和 delete [] 的真正區別
    ,請點擊 → 這裡查看詳情;c++中對new申請的內存的釋放方式有delete和delete[]兩種方式,到底這兩者有什麼區別呢?//方式2肯定會有很多人說方式1肯定存在內存洩漏,是這樣嗎?針對簡單類型 使用new分配後的不管是數組還是非數組形式內存空間用兩種方式均可 如:int *a = new int[10];delete a;delete [] a;此種情況中的釋放效果相同,原因在於:分配簡單類型內存時,內存大小已經確定,系統可以記憶並且進行管理,在析構時,系統並不會調用析構函數,它直接通過指針可以獲取實際分配的內存空間
  • delete、truncate、drop的區別有哪些,該如何選擇
    這裡有個【1024】紅包等你來領取MySQL刪除數據的方式都有哪些?咱們常用的三種刪除方式:通過 delete、truncate、drop 關鍵字進行刪除;這三種都可以用來刪除數據,但場景不同。往期面試題匯總:001期~150期匯總2、truncateTruncate table TABLE_NAME1、truncate:屬於資料庫DDL定義語言,不走事務,原數據不放到 rollback segment 中,操作不觸發 trigger。
  • malloc/free與new/delete的區別
    由於malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加malloc/free。二、在用法上也有所不同。如果對象有多個構造函數,那麼new 的語句也可以有多種形式。如果用new 創建對象數組,那麼只能使用對象的無參數構造函數。
  • 面試結束後要加微信,HR難道是有什麼其他意思?
    其他求職者是這樣說的:求職1號:面試官要當然給啊,不然你還想不想過?就當做多認識一個大佬,還可以跟蹤面試狀況。之前有面試官加了我還布置了作業。求職3號:加唄,反正我有兩個微信號,小號發的朋友圈都是職場範兒哈哈。【手動點個讚】看了上面三個答案,你有自己的答案了嗎?現在很多人都有兩個微信號,所以推脫不掉又不想太過暴露自己生活情況的同學可以直接讓面試官加小號就可以了。
  • MySQL慢查詢參數min_examined_row_limit
    除了以上這幾個參數外,還有一些參數與慢查詢日誌有關,如下:log_queries_not_using_indexes=1log_throttle_queries_not_using_indexes=20min_examined_row_limit=100log_slow_admin_statements=1log_slow_slave_statements=1log_queries_not_using_indexes
  • 別不信,你可能連 MySQL 的 Delete 都不會!
    今天我要說的這個問題是,你會了 MySQL 的 Delete 語法,會寫 delete 語句是不是就一定會刪數據了?我們先來看一個例子。假設現在有一張表,需要刪除前 1 萬條數據。有下面三種SQL語句,你會選擇哪一個?為什麼?
  • MySQL恢復delete的數據
    如果沒有完整的把資料庫或者表刪除掉,而僅僅是刪除了表裡的部分數據,比如本文探討的:delete命令數據誤刪恢復,這種情況應該發生的概率更大,畢竟有機會刪除庫和表的權限和命令通常控制的都很嚴(刪庫跑路是段子)。有人會有疑惑,用delete命令去刪除數據,不都是正常想刪除掉的麼,為何存在要恢復的情況。
  • 面試後遲遲等不到入職通知,有必要主動聯繫面試官詢問結果嗎?
    有個名為「小雅」的網友問,她面試了一家公司,面試過程中自我感覺良好,面試結束後卻遲遲等不到入職通知,該主動聯繫面試官詢問結果嗎?小雅,回答你的問題前,先講講我的真實經歷。問到的東西挺詳細,主要聊我在大學時的經歷,我也沒含糊,把我過往最成功的經歷洋洋灑灑地都說了。然後他就讓我回去等通知,並且告訴我筆試題做得一般。回去等了1周,沒消息。這期間,我還面試了另外一家做儀表的公司,順利通過了,對方第二天就聯繫我,問我工資待遇要求,以及入職時間。
  • 面試後等不到通知,有必要打電話給面試官嗎?資深HR給出3條建議
    最近有一些朋友問我這樣一個問題:「如果面試後等不到通知,有必要給面試官打電話嗎?」在回答這個問題之前,我先講一個自己的面試經歷。我曾在一家保險公司做壽險營銷,工作了兩年後,公司招聘講師,我踴躍地報了名,因為我很喜歡這個崗位,而且我平時主持晨會的次數也比較多,信心還是比較充足的,但是競爭也很激勵。