1. 程式人生 > >表上觸發器導致慢查詢

表上觸發器導致慢查詢

準備 但是 ssi 導致 情況 tro 通過 執行計劃 如果

觸發器導致慢查詢
情況說明:慢日誌每天幾乎同一時刻都會有一條刪除的慢查詢,而且語句一樣,除了日期。然後發現表上只有一個主鍵,沒有其它索引,看執行計劃是全表掃描,但count一下總共也就900多行,執行3秒鐘,不能忍。給表上這個時間字段加上索引,刪除是按照時間刪的,看著掃描行數下來了,但是一執行還是3秒多,啥情況?

我把整張表dump出來,準備在自己刪的差不多時候,再導回來。無意間打開導出的sql,發現該表上有一個刪除行之後執行的觸發器。

然後我就把觸發器刪除了,發現執行刪除sql就很快,而且全表掃描也很快,但是觸發器存在的情況下就極慢。

為啥呢???

我想看看我這條語句到底執行多久,於是我打開了profile功能。
通過set profiling=1
set session profiling_history_size = 100;

我這個sql一次刪除31行
然後執行時間是2.28秒

show profiles
發現每個觸發器平均執行0.07秒
0.07乘31等於2.17秒
這樣的話,sql語句執行就是0.11秒

然後我又試了刪除4行
發現總的執行時間是0.36秒,如果按觸發器每條0.07秒,4條就是0.28秒,
那麽sql的執行時間就是0.08秒。
基本上驗證了一個猜測,執行的sql如果觸發了觸發器,那麽執行的總時間就是sql執行時間+觸發器執行時間。

如果更改的行數少,比如我這個4條,時間還能接受,如果更改大部分行,那麽時間相當可怕,因為變更了多少行,觸發器就執行多少次,時間累加。

表上觸發器導致慢查詢