天天看點

對一個MySQL存儲過程的優化

在編寫MySQL存儲過程的過程中,我們會時不時地需要對某些存儲過程進行優化,其目的是確定代碼的可讀性、正确性及運作性能。本文以作者實際工作為背景,介紹了對某一個MySQL存儲過程優化的整個過程。

在本文中,需要被優化的存儲過程如下:

在存儲過程中使用到的表tb_testnum結構如下:

在存儲過程中使用到的另外一張表tb_testnum_tmp結構如下:

從兩個表的結構可以看出,tb_testnum和tb_testnum_tmp所包含的字段完全相同,存儲過程pr_dealtestnum的作用是根據輸入參數将tb_testnum_tmp表的資料插入到tb_testnum表中。

很明顯,雖然能夠實作預期的功能,但存儲過程pr_dealtestnum的代碼還有改進的地方。下面,我們一步一步來對其進行優化。

優化一

存儲過程pr_dealtestnum的主體是一條insert語句,但這條insert語句裡面又包含了select語句,這樣的編寫是不規範的。是以,我們要把這條insert語句拆分成兩條語句,即先把資料從tb_testnum_tmp表中查找出來,再插入到tb_testnum表中。修改之後的存儲過程如下:

優化二

在向tb_testnum表插入資料之前,要判斷該條資料在表中是否已經存在了,如果存在,則不再插入資料。同理,在從tb_testnum_tmp表中查詢資料之前,要先判斷該條資料在表中是否存在,如果存在,才能從表中查找資料。修改之後的存儲過程如下:

優化三

不管向tb_testnum表插入資料的操作執行成功與否,都應該有一個辨別值來表示執行的結果,這樣也友善開發人員對程式流程的追蹤和調試。也就是說,在每條leave語句之前,都應該有一個傳回值,我們為此定義一個輸出參數。修改之後的存儲過程如下:

優化四

我們注意到“insert into tb_testnum values(p_boxnumber,p_usertype);”語句中,tb_testnum表之後沒有列出具體的字段名,這個也是不規範的。如果在以後的軟體版本中,tb_testnum表中新增了字段,那麼這條insert語句極有可能會報錯。是以,規範的寫法是無論tb_testnum表中有多少字段,在執行insert操作時,都要列出具體的字段名。修改之後的存儲過程如下:

優化五

在執行insert語句之後,要用MySQL中自帶的@error_count參數來判斷插入資料是否成功,友善開發人員跟蹤執行結果。如果該參數的值不為0,表示插入失敗,那麼我們就用一個傳回參數值來表示操作失敗。修改之後的存儲過程如下:

結束語

從上面可以看出,一個短短的存儲過程,就有這麼多需要優化的地方,看來存儲過程的編寫也不是一件很簡單的事情。确實,我們在編寫代碼(不僅僅是存儲過程)的時候,一定要從代碼的功能、可讀性、性能等多方面來考慮,這樣才能夠寫出優美的、具備較長生命周期的代碼,進而開發出高品質的軟體産品。