Home  >  Article  >  Database  >  Optimization example of MySQL stored procedure_MySQL

Optimization example of MySQL stored procedure_MySQL

WBOY
WBOYOriginal
2016-09-09 08:13:371101browse

Foreword

In the process of database development, complex business logic and database operations are often encountered. At this time, stored procedures are used to encapsulate database operations. If the project has many stored procedures and the writing is not standardized, it will make it difficult to maintain the system in the future and make it difficult to understand the logic of the large stored procedures. In addition, if the amount of data in the database is large or the project has high performance requirements for the stored procedures, it will be difficult to maintain the system in the future. You will encounter optimization problems, otherwise the speed may be very slow. Through personal experience, an optimized stored procedure is even hundreds of times more efficient than a stored procedure with poor performance. The following introduces the entire process of optimizing a certain MySQL stored procedure.

In this article, the stored procedures that need to be optimized are as follows:

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';

The table tb_testnum used in the stored procedure has the following structure:

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);

Another table tb_testnum_tmp used in the storage process has the following structure:

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);

It can be seen from the structure of the two tables that the fields contained in tb_testnum and tb_testnum_tmp are exactly the same. The function of the stored procedure pr_dealtestnum is to insert the data of the tb_testnum_tmp table into the tb_testnum table based on the input parameters. .

Obviously, although it can achieve the expected function, the code of the stored procedure pr_dealtestnum still has room for improvement.

Below, we will optimize it step by step.

Optimization 1

The main body of the stored procedure pr_dealtestnum is an insert statement, but this insert statement also contains a select statement. Such writing is irregular. Therefore, we need to split this insert statement into two statements, that is, first find the data from the tb_testnum_tmp table, and then insert it into the tb_testnum table. The modified stored procedure is as follows:

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';

Optimization 2

Before inserting data into the tb_testnum table, it is necessary to determine whether the data already exists in the table. If it exists, no more data will be inserted. In the same way, before querying data from the tb_testnum_tmp table, you must first determine whether the data exists in the table. If it exists, you can search for the data from the table. The modified stored procedure is as follows:

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';

Optimization 3

No matter whether the operation of inserting data into the tb_testnum table is executed successfully or not, there should be an identification value to represent the result of the execution, which also facilitates developers to track and debug the program flow. In other words, before each leave statement, there should be a return value, and we define an output parameter for this. The modified stored procedure is as follows:

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';

Optimization 4

We noticed that in the "insert into tb_testnum values(p_boxnumber,p_usertype);" statement, there is no specific field name listed after the tb_testnum table, which is also irregular. If in future software versions, new fields are added to the tb_testnum table, then this insert statement will most likely report an error. Therefore, the standard way of writing is that no matter how many fields there are in the tb_testnum table, when performing an insert operation, the specific field names must be listed. The modified stored procedure is as follows:

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';

Optimization 5

After executing the insert statement, use the @error_count parameter that comes with MySQL to determine whether the inserted data is successful, so that developers can track the execution results. If the value of this parameter is not 0, it means that the insertion failed, then we use a return parameter value to indicate that the operation failed. The modified stored procedure is as follows:

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';

Summary

As can be seen from the above, a short stored procedure has so many areas that need to be optimized. It seems that writing a stored procedure is not a very simple matter. Indeed, when we write code (not just stored procedures), we must consider the function, readability, performance and other aspects of the code, so that we can write beautiful code with a long life cycle. And then develop high-quality software products. I hope this article can be helpful to everyone in learning MySQL stored procedures, and thank you for your support.

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn