mysql觸發器對效能影響
阿新 • • 發佈:2019-01-31
大佬們一直說不要用觸發器,觸發器對效能影響很多,但是一直似懂非懂,藉著最近有時間準備清理下公司庫裡的觸發器,研究下觸發器的機制跟對效能影響。
想來定義:
在MySQL中,觸發器可以在你執行INSERT、UPDATE或DELETE的時候,執行一些特定的操作。在建立觸發器時,可以指定是在執行SQL語句之前或是之後執行這些操作。通過觸發器,你可以實現一些業務邏輯或一些資料限制,在簡化應用程式邏輯,優化系統性能時非常有用。但在使用MySQL觸發器也有一些注意事項,否則會導致觸發器不能工作或不按指定的方式工作。
1. MySQL觸發器注意事項
MySQL觸發器使用非常簡單,當然其功能也比較有限。當你在專案中大量使用觸發器,那麼你應該注意以下幾點,以避免觸發器不按預期效果執行:
- MySQL觸發器能
基於行觸發
,MySQL觸發器始終時基於表中的一條記錄觸發,而不是一組SQL語句。因此,如果需要變動整個資料集而資料集資料量又較大時,觸發器效果會非常低。 - 每一個表的一個事件只能定義一個觸發器,例如:不能在
AFTER INSERT
上定義一個以上的觸發器。
2. MySQL觸發器可能導致的問題
由於MySQL觸發器基於行觸發
的特性,因此對於批量操作並不適合使用觸發器,如:彙總表、快取表等。觸發器使用不當,可能會導致以下問題:
- 一個MySQL觸發器可能會關聯到另外一張表或幾張表的操作。因此,會導致資料庫伺服器負荷也會相應的增加一倍或幾倍,如果出現因為觸發器問題導致的效能問題,會很難定位問題位置和原因。
- 在基於鎖的操作中,觸發器可能會導致鎖等待或死鎖。觸發器執行失敗,原來執行的SQL語名也會執行失敗。而因為觸發器導致的失敗結果和失敗原因,往往很難排查。
由於MySQL觸發器的種種問題,要求我們在建立觸發器就應該充分考慮。避免使用不合適的觸發器,並能對所有觸發器有足夠的瞭解,以便問題的定位和排查。
3. MySQL觸發器的好處
對MySQL觸發器有足夠的認識和了解後,MySQL觸發器會給我們帶來極大的便利。當實現一些系統約束時,或在實現系統維護及針對操作資料的更新時,使用觸發器都非常方便。在之膠我們介紹了MySQL觸發器不適合做的一些工作,但MySQL觸發器在以下一些應用場景中,會非常實用:
- 基於行資料變更的日誌記錄。如:在使用者訂單系統中,我們可以基於使用者訂單資料狀態的改變,使用觸發器構建使用者訂單日誌表資料。
- 基於行資料變更的關係資料的更新。如:使用者訂單改變至付款或相關狀態時,我們可以基於使用者訂單資料狀態的改變,使用觸發器改變使用者會付款或相應狀態資訊。
- 基於行資料變更的資料彙總。如:使用者訂單成交或失敗,我們可以基於使用者訂單資料狀態的改變,使用觸發器構建使用者總成交量或失敗量彙總資料。
以上僅列舉了一些常用場景,合理的利用MySQL觸發器會在資料庫工作效率和開發效率上有很大的提高。關於觸發器的使用方法,請參考:MySql觸發器trigger的使用