亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL存儲過程的優化實例

2024-07-24 13:10:09
字體:
來源:轉載
供稿:網友

前言

在數據庫的開發過程中,經常會遇到復雜的業務邏輯和對數據庫的操作,這個時候就會用存儲過程來封裝數據庫操作。如果項目的存儲過程較多,書寫又沒有一定的規范,將會影響以后的系統維護困難和大存儲過程邏輯的難以理解,另外如果數據庫的數據量大或者項目對存儲過程的性能要求很,就會遇到優化的問題,否則速度有可能很慢,經過親身經驗,一個經過優化過的存儲過程要比一個性能差的存儲過程的效率甚至高幾百倍。下面介紹某一個MySQL存儲過程優化的整個過程。

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber  varchar(30))pr_dealtestnum_label:begin    insert into tb_testnum select boxnumber,usertype from tb_testnum_tmp where boxnumber= p_boxnumber;    leave pr_dealtestnum_label;end;//delimiter ;select 'create procedure pr_dealtestnumok';

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

drop table if exists tb_testnum;create table tb_testnum(  boxnumber varchar(30) not null,  usertype  int     not null                                         );create unique index idx1_tb_testnum ontb_testnum(boxnumber);

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

drop table if exists tb_testnum_tmp;create table tb_testnum_tmp(  boxnumber varchar(30) not null,  usertype  int     not null  );create unique index idx1_tb_testnum_tmp ontb_testnum_tmp(boxnumber);

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

很明顯,雖然能夠實現預期的功能,但存儲過程pr_dealtestnum的代碼還有改進的地方。

下面,我們一步一步來對其進行優化。

優化一

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber  varchar(30))pr_dealtestnum_label:begin    declare p_usertype  int;    select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;    insert into tb_testnum values(p_boxnumber,p_usertype);    leave pr_dealtestnum_label;end;//delimiter ;select 'create procedure pr_dealtestnum ok';

優化二

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber  varchar(30))pr_dealtestnum_label:begin    declare p_usertype  int;    declare p_datacount int;    select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;    if p_datacount > 0 then    begin      select usertype into p_usertype fromtb_testnum_tmp where boxnumber=p_boxnumber;    end;    else    begin      leave pr_dealtestnum_label;    end;    end if;    select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;    if p_datacount = 0 then    begin      insert into tb_testnum values(p_boxnumber,p_usertype);      leave pr_dealtestnum_label;    end;    else    begin      leave pr_dealtestnum_label;    end;    end if;end;//delimiter ;select 'create procedure pr_dealtestnum ok';

優化三

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber varchar(30),  out  p_result   int -- 0-succ, other-fail)pr_dealtestnum_label:begin    declare p_usertype  int;    declare p_datacount int;    select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;    if p_datacount > 0 then    begin      select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;    end;    else    begin      set p_result = 1;      leave pr_dealtestnum_label;    end;    end if;    select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;    if p_datacount = 0 then    begin      insert into tb_testnum values(p_boxnumber,p_usertype);      set p_result = 0;      leave pr_dealtestnum_label;    end;    else    begin      set p_result = 2;      leave pr_dealtestnum_label;    end;    end if;end;//delimiter ;select 'create procedure pr_dealtestnum ok';

優化四

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber varchar(30),  out  p_result   int  -- 0-succ, other-fail)pr_dealtestnum_label:begin    declare p_usertype  int;    declare p_datacount int;    select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;    if p_datacount > 0 then    begin      select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;    end;    else    begin      set p_result = 1;      leave pr_dealtestnum_label;    end;    end if;    select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;    if p_datacount = 0 then    begin      insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);      set p_result = 0;      leave pr_dealtestnum_label;    end;    else    begin      set p_result = 2;      leave pr_dealtestnum_label;    end;    end if;end;//delimiter ;select 'create procedure pr_dealtestnum ok';

優化五

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

drop procedure if exists pr_dealtestnum;delimiter //create procedure pr_dealtestnum(  in  p_boxnumber varchar(30),  out  p_result  int  -- 0-succ, other-fail)pr_dealtestnum_label:begin    declare p_usertype  int;    declare p_datacount int;    select count(*) into p_datacount from tb_testnum_tmp where boxnumber=p_boxnumber;    if p_datacount> 0 then    begin      select usertype into p_usertype from tb_testnum_tmp where boxnumber=p_boxnumber;    end;    else    begin      set p_result = 1;      leave pr_dealtestnum_label;    end;    end if;    select count(*) into p_datacount from tb_testnum where boxnumber=p_boxnumber;    if p_datacount = 0then    begin      insert into tb_testnum(boxnumber,usertype) values(p_boxnumber,p_usertype);      if @error_count<>0 then      begin        set p_result= 3;      end;      else      begin        set p_result= 0;      end;      end if;    end;    else    begin      set p_result = 2;    end;    end if;    leave pr_dealtestnum_label;end;//delimiter ;select 'create procedure pr_dealtestnum ok';

總結

從上面可以看出,一個短短的存儲過程,就有這么多需要優化的地方,看來存儲過程的編寫也不是一件很簡單的事情。確實,我們在編寫代碼(不僅僅是存儲過程)的時候,一定要從代碼的功能、可讀性、性能等多方面來考慮,這樣才能夠寫出優美的、具備較長生命周期的代碼,進而開發出高質量的軟件產品。希望本文能對大家學習MySQL存儲過程有所幫助,也謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩综合精品| 国产精品久久久91| 精品国产拍在线观看| 国产精品永久在线| 亚洲精品久久视频| 久久精品国产一区二区三区| 亚洲精品成人av| 成人亚洲综合色就1024| 97视频人免费观看| 国产精品69精品一区二区三区| 久久99热这里只有精品国产| 久久久久久久久久婷婷| 色综合久久久久久中文网| 国产精品白嫩初高中害羞小美女| 欧美孕妇孕交黑巨大网站| 91理论片午午论夜理片久久| 国产成人精彩在线视频九色| 国产亚洲美女精品久久久| 91av在线免费观看视频| 中文欧美日本在线资源| 亚洲第一福利视频| 欧美性生交xxxxx久久久| 欧美激情二区三区| 欧洲亚洲女同hd| 成人午夜小视频| 国产成人精品电影| 中文字幕亚洲一区二区三区五十路| 97视频在线观看视频免费视频| 国产亚洲精品久久久久久777| 九九视频直播综合网| 久久国产精品久久久久久久久久| 国产精品高潮呻吟久久av无限| 一区二区国产精品视频| 久久91精品国产91久久久| 欧美精品免费在线观看| 国产69精品99久久久久久宅男| 国产91热爆ts人妖在线| 国产精品大陆在线观看| 国产精品日韩欧美大师| 久久精品视频一| 亚洲国语精品自产拍在线观看| 欧美激情乱人伦一区| 欧美亚洲第一页| 97婷婷大伊香蕉精品视频| 欧美成人精品在线观看| 中文字幕亚洲综合久久| 久久久久久久久久久免费精品| 热久久99这里有精品| 色综合伊人色综合网| 精品国产乱码久久久久久天美| 国产成人一区二区在线| 中文字幕欧美日韩精品| 久久久久久久国产精品视频| 福利一区视频在线观看| 亚洲日本中文字幕| 欧美激情视频免费观看| 夜夜嗨av色一区二区不卡| 欧美激情一区二区三区在线视频观看| 国产精品海角社区在线观看| 欧美老妇交乱视频| 日本精品久久久久久久| 久久精品视频导航| 国内精品视频在线| 91免费版网站入口| 98午夜经典影视| 羞羞色国产精品| 国产91ⅴ在线精品免费观看| 国产精品国产福利国产秒拍| 2023亚洲男人天堂| 草民午夜欧美限制a级福利片| 亚洲精品久久久久国产| 久久综合色88| 亚洲精品自拍视频| 日韩经典中文字幕| 国产精品久久久久久久久久久不卡| 蜜臀久久99精品久久久无需会员| 日韩a**中文字幕| 国产一区二区三区视频在线观看| 一本色道久久88亚洲综合88| 欧美日韩国产成人在线| 国产欧美最新羞羞视频在线观看| 欧美精品在线观看| 欧美综合在线第二页| 在线观看精品自拍私拍| 欧美成人精品在线| 亚洲视频专区在线| 国产日韩在线看片| 亚洲精品视频网上网址在线观看| 精品欧美aⅴ在线网站| 午夜精品蜜臀一区二区三区免费| 亚洲爱爱爱爱爱| 91黄色8090| 日本一欧美一欧美一亚洲视频| 亚洲欧美激情精品一区二区| 久久97精品久久久久久久不卡| 国产免费一区二区三区在线观看| 国产精品久久久久久久久久三级| 欧美大尺度电影在线观看| 午夜精品久久久久久99热| 欧美精品日韩www.p站| 国产日韩欧美自拍| 国产日韩欧美视频| 欧美国产日本在线| 亚洲欧美精品一区| 亚洲欧美一区二区三区久久| 国产精品第三页| 亚洲第一精品自拍| 日韩av中文字幕在线| 欧美国产亚洲精品久久久8v| 久热在线中文字幕色999舞| 国产精品免费久久久久影院| 精品国产区一区二区三区在线观看| 在线亚洲欧美视频| 亚洲色图欧美制服丝袜另类第一页| 欧美精品激情在线观看| 久久最新资源网| 97精品久久久| 久久免费视频网| 亚洲精品久久久久久久久久久久| 国产精品电影一区| 欧美在线一级va免费观看| 日韩成人在线视频网站| 欧美性资源免费| 国产精品午夜一区二区欲梦| 在线精品视频视频中文字幕| 成人午夜激情免费视频| 日韩欧美国产中文字幕| 国产91在线视频| 精品人伦一区二区三区蜜桃免费| 国模私拍视频一区| 国产97在线播放| 亚洲精品久久7777777| 一区二区三区无码高清视频| www.欧美三级电影.com| 深夜福利91大全| 在线观看视频99| 日本精品视频在线观看| 精品国内自产拍在线观看| 欧美激情第6页| 国产精品爽爽爽爽爽爽在线观看| 91精品久久久久久久久中文字幕| 欧美一区二区大胆人体摄影专业网站| 亚洲加勒比久久88色综合| 伊是香蕉大人久久| 精品久久久久久久久久ntr影视| 亚洲国语精品自产拍在线观看| 国产精品爱啪在线线免费观看| 国产一区二区三区视频在线观看| 欧美亚洲国产视频小说| 中文在线不卡视频| 国产精品专区h在线观看| 91av视频在线观看| 国产日本欧美一区二区三区| 欧美成人激情图片网| 九九九久久国产免费| 日韩精品视频在线播放| 国产性猛交xxxx免费看久久| 欧美日韩在线第一页| 久久天堂av综合合色| 日韩av观看网址| 日韩精品在线视频| 国产亚洲精品成人av久久ww| 欧美成人一区在线| 亚洲精品小视频在线观看|