表上觸發器導致慢查詢
阿新 • • 發佈:2018-07-25
準備 但是 ssi 導致 情況 tro 通過 執行計劃 如果 觸發器導致慢查詢
情況說明:慢日誌每天幾乎同一時刻都會有一條刪除的慢查詢,而且語句一樣,除了日期。然後發現表上只有一個主鍵,沒有其它索引,看執行計劃是全表掃描,但count一下總共也就900多行,執行3秒鐘,不能忍。給表上這個時間字段加上索引,刪除是按照時間刪的,看著掃描行數下來了,但是一執行還是3秒多,啥情況?
情況說明:慢日誌每天幾乎同一時刻都會有一條刪除的慢查詢,而且語句一樣,除了日期。然後發現表上只有一個主鍵,沒有其它索引,看執行計劃是全表掃描,但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條,時間還能接受,如果更改大部分行,那麽時間相當可怕,因為變更了多少行,觸發器就執行多少次,時間累加。
表上觸發器導致慢查詢