Mysql
為什麼這個觸發器會減慢更新速度
我有一張桌子。讓我們稱之為表tableA。還有另一個表保存有關 tableA 歷史的數據。我們稱它為 tableA_records。
在 tableA 上,有一個類似於以下內容的更新觸發器:
CREATE TRIGGER upd_tableA AFTER UPDATE ON tableA FOR EACH ROW if @disable_triggers is null then BEGIN SET @now = unix_timestamp(now()); UPDATE tableA_records SET valid_to = @now WHERE valid_to IS NULL AND tableA_id = old.id; INSERT INTO tableA_records ( tableA_id, column2, column3, ...., column27, valid_from, valid_to ) VALUES ( new.id, new.column2, new.column3, ...., new.column27, @now, NULL ); END; end if
我遇到的問題是觸發器會大大減慢更新速度。如果沒有觸發器,更新 tableA 的 100 行需要 0.2 秒。在 tableA_records 上插入這 100 行需要 0.25 秒。如果我們將每個時間相加,觸發器(更新 tableA_records,插入 tableA_records)和触發操作(更新 tableA)的組合操作應該需要 0.65 秒。使用扳機,需要 35 秒。
任何人都知道是什麼導致了放緩?
您的觸發器執行兩個不同的操作。
- 它“結束日期”
tableA_records
表中的舊記錄。- 它將新記錄的新副本插入到
tableA_records
表中。在沒有看到
tableA_Records
審計表是如何建構的情況下,我無法確定一個步驟是否比另一個步驟導致更多問題,但是您可以提出一些問題和嘗試的步驟:
- 列上有索引
tableA_records.tableA_id
嗎?應該有。- 表上還有哪些其他索引
tableA_records
?他們有必要嗎?它們設計得好嗎?- 您是否嘗試過註釋掉更新語句,然後測試觸發器,然後取消註釋並註釋插入語句並重新測試?這將告訴您更新或插入是否較慢。
我懷疑你會發現更多的延遲是由更新而不是插入引起的,因為更新需要掃描索引或全表掃描以找到合適的行。確保該列已正確索引。
如果表中的其他列
tableA_records
被索引,則查看是否需要該索引。索引過多會減慢插入速度。