delete與limit的結合

2021-10-25 08:24:49 字數 1801 閱讀 8548

在日常的開發工作中,或多或少都會遇到刪除單條資料的時候,那平時是怎麼寫的呢,是不是這樣:

delete

from table_name where id =

1;

在刪除操作執行的過程中,如果命中了第一條資料,執行完刪除操作後還會去掃瞄全表,但是如果加上了limit 1 ,執行完就return了,效率高低,一眼可見。

在實際開發中還會遇到刪除滿足某一條件的多條資料,如:

delete

from

user

where department =

1;

如果是清空表資料建議直接用 truncate,效率上 truncate 遠高於 delete,應為 truncate 不走事務,不會鎖表,也不會生產大量日誌寫入日誌檔案;truncate table table_name 後立刻釋放磁碟空間,並重置 auto_increment 的值。delete 刪除不釋放磁碟空間,但後續 insert 會覆蓋在之前刪除的資料上。

首先,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 user where *** = 1;

降低寫錯 sql 的代價,就算刪錯了,比如 limit 500, 那也就丟了 500 條資料,並不致命,通過 binlog 也可以很快恢復資料。

避免了長事務,delete 執行時 mysql 會將所有涉及的行加寫鎖和 gap 鎖(間隙鎖),所有 dml 語句執行相關行會被鎖住,如果刪除數量大,會直接影響相關業務無法使用。

delete 資料量大時,不加 limit 容易把 cpu 打滿,導致越刪越慢。

針對上述第二點,前提是 *** 上加了索引,大家都知道,加鎖都是基於索引的,如果 *** 欄位沒索引,就會掃瞄到主鍵索引上,那麼就算 *** = 1 的只有一條記錄,也會鎖表。

對於 delete limit 的使用,mysql 大佬丁奇有一道題:

如果你要刪除乙個表裡面的前 10000 行資料,有以下三種方法可以做到:

第一種,直接執行 delete from t limit 10000;

第二種,在乙個連線中迴圈執行 20 次 delete from t limit 500;

第三種,在 20 個連線中同時執行 delete from t limit 500。

怎麼刪除表的前 10000 行。比較多的朋友都選擇了第二種方式,即:在乙個連線中迴圈執行 20 次 delete from t limit 500。確實是這樣的,第二種方式是相對較好的。

第一種方式(即:直接執行 delete from t limit 10000)裡面,單個語句占用時間長,鎖的時間也比較長;而且大事務還會導致主從延遲。

第三種方式(即:在 20 個連線中同時執行 delete from t limit 500),會人為造成鎖衝突。

這個例子對我們實踐的指導意義就是,在刪除資料的時候盡量加 limit。這樣不僅可以控制刪除資料的條數,讓操作更安全,還可以減小加鎖的範圍。所以,在 delete 後加 limit 是個值得養成的好習慣。

Limit結合使用SQL calc found

在很多分頁的程式中都這樣寫 select count from table where 查出符合條件的記錄總數 select from table where limit m,n 查詢當頁要顯示的資料 這樣的語句可以改成 select sql calc found rows from table w...

order by和limit結合使用的問題

在mysql中我們常常用order by來進行排序,使用limit來進行分頁,當需要先排序後分頁時我們往往使用類似的寫法select from 表名 order by 排序字段 limt m,n。但是這種寫法卻隱藏著較深的使用陷阱。在排序欄位有資料重複的情況下,會很容易出現排序結果與預期不一致的問題...

delete與delete 的區別

c 告訴我們在 用 new 分配的單個物件的記憶體空間的時候用 delete,用 new 分配的一組物件的記憶體空間的時候用 delete。很多人注意到了這個問題,但是卻不清楚為什麼要這樣做,不這樣做行不行。關於 new 和 delete,其中又分為兩種情況 1 為基本資料型別分配和 空間 2 為自...