2011-02-17 14 views
7

我目前正在大學攻讀「性能評估」課程,現在我們正在做一個任務,在這裏我們正在測試PHP和MySQL數據庫服務器上的CPU使用情況。我們使用httperf創建自定義流量,並使用vmstat來跟蹤服務器負載。我們正在運行3000個連接到PHP服務器的INSERT和DELETE(單獨運行)。MySQL:爲什麼DELETE比INSERT更佔用CPU資源?

數字顯示DELETE操作比INSERT處理更多的CPU - 我只是想知道爲什麼?

我最初認爲INSERT需要更多的CPU使用率,因爲需要重新創建索引,需要將數據寫入磁盤等。但顯然我錯了,我想知道是否有人能告訴我技術這是原因。

+0

明顯的問題:它是否總是*使得DELETE比INSERT更耗費資源,或者它可能只是您的特定設置?如果總是如此,誰說的? – Tomalak 2011-02-17 20:08:19

回答

3

DELETE還要求將數據寫入磁盤,並重新計算索引,此外,還需要一組邏輯比較來首先查找要刪除的記錄。

+2

這個參數很大程度上取決於數據庫中的約束,以及插入的數據是否會受到這些約束的影響。 – 2011-02-17 20:06:20

1

刪除需要比您想象的更多的邏輯;多少取決於模式的結構。

在幾乎所有情況下,當刪除記錄時,服務器必須檢查該記錄的任何依賴關係作爲外鍵引用。簡而言之,系統表查找帶有外鍵引用的表定義的系統表,然後爲引用要刪除的記錄的記錄選擇每個表。就在那裏,你已經將計算時間增加了幾個數量級,而不管服務器是否進行級聯刪除或只是拋出錯誤。

自平衡的內部數據結構也必須重新組織,並且索引必須更新以刪除索引樹中任何現在爲空的分支,但是這些將在插入操作中具有對應部分。

+1

如果沒有註冊該表的外鍵(外出),則不需要額外的工作。如果有一個外鍵(傳入),那麼插入的工作量就很多。外鍵參數不夠強大恕我直言。 – Tomalak 2011-02-17 20:10:44

5

至少與InnoDB(我希望他們有這個),你有更多的操作即使沒有外鍵。一種插件,大致是這樣的:

  1. 插入行
  2. 馬克二進制日誌緩衝區
  3. 馬克提交

缺失做到以下幾點:

  1. 馬克行取出(取與插入頁面相同的頁面被重寫)
  2. Mark in binary log buff呃
  3. 馬克致力於
  4. 其實去刪除行,(採取同樣的打擊作爲插入 - 頁面重寫)
  5. 淨化線程跟蹤二進制日誌緩衝區的缺失了。

爲此,您有兩次工作要刪除而不是插入。刪除操作需要這兩個寫操作,因爲它必須被標記爲對所有版本都將被刪除,但只有當沒有事務處理時才能刪除。由於InnoDB只寫入完整的數據塊,所以對磁盤的修改懲罰是不變的。

相關問題