Mysql

為什麼這個觸發器會減慢更新速度

  • February 1, 2017

我有一張桌子。讓我們稱之為表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 秒。

任何人都知道是什麼導致了放緩?

您的觸發器執行兩個不同的操作。

  1. 它“結束日期”tableA_records表中的舊記錄。
  2. 它將新記錄的新副本插入到tableA_records表中。

在沒有看到tableA_Records審計表是如何建構的情況下,我無法確定一個步驟是否比另一個步驟導致更多問題,但是您可以提出一些問題和嘗試的步驟:

  1. 列上有索引tableA_records.tableA_id嗎?應該有。
  2. 表上還有哪些其他索引tableA_records?他們有必要嗎?它們設計得好嗎?
  3. 您是否嘗試過註釋掉更新語句,然後測試觸發器,然後取消註釋並註釋插入語句並重新測試?這將告訴您更新或插入是否較慢。

我懷疑你會發現更多的延遲是由更新而不是插入引起的,因為更新需要掃描索引或全表掃描以找到合適的行。確保該列已正確索引。

如果表中的其他列tableA_records被索引,則查看是否需要該索引。索引過多會減慢插入速度。

引用自:https://dba.stackexchange.com/questions/162944