• notice
  • Congratulations on the launch of the Sought Tech site

Optimization of mysql stored procedures

Foreword

In the database development process, you often encounter complex business logic and database operations.At this time, stored procedures are used to encapsulate database operations.If there are many stored procedures in the project and there are no certain specifications for writing, it will affect the difficulty of future system maintenance and the logic of large stored procedures.In addition, if the amount of data in the database is large or the performance requirements of the project on the stored procedures are very high, then You will encounter optimization problems, otherwise the speed may be very slow.After personal experience, an optimized stored procedure is even hundreds of times more efficient than a poorly performing stored procedure.The following describes the entire process of a certain MySQL stored procedure optimization.

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 structure of the table tb_testnum used in the stored procedure is as follows:

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

The structure of another table tb_testnum_tmp used in the stored procedure is as follows:

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

As can be seen from the structure of the two tables, the fields contained in tb_testnum and tb_testnum_tmp are exactly the same.The function of the stored procedure pr_dealtestnum is Insert the data from the tb_testnum_tmp table into the tb_testnum table according to the input parameters.

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

Next, we will optimize it step by step.

Optimization One

The main body of the stored procedure pr_dealtestnum is an insert statement, but this insert statement also contains a select statement, which is not standardized.Therefore, we need to split this insert statement into two statements, that is, first look up 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 II

Before inserting data into the tb_testnum table, it is necessary to determine whether the data already exists in the table, and if it does, 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, and if it exists, you can find the data in 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 Three

Regardless of whether the operation of inserting data into the tb_testnum table is executed successfully or not, there should be an identification value to indicate the result of the execution, which is also convenient for 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 Four

We noticed that in the statement "insert into tb_testnum values(p_boxnumber,p_usertype);", no specific field names are listed after the table tb_testnum, this is also not standard of.If a new field is added to the tb_testnum table in a later software version, then this insert statement is most likely to report an error.Therefore, the standard way of writing is that no matter how many fields there are in the tb_testnum table, perform insertWhen operating, 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 Five

After executing the insert statement, use the @error_count parameter that comes with MySQL to determine whether the data is inserted successfully, so that developers can track the results of the execution.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 places to be optimized.It seems that the writing of 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 help you learn MySQL stored procedures, and thank you for your support.

Tags

Technical otaku

Sought technology together

Related Topic

1 Comments

author

order atorvastatin 80mg generic & lt;a href="https://lipiws.top/"& gt;order atorvastatin without preion& lt;/a& gt; order atorvastatin 20mg

Iiyemh

2024-03-08

Leave a Reply

+