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.

This article explores optimizing MySQL memory usage in Docker. It discusses monitoring techniques (Docker stats, Performance Schema, external tools) and configuration strategies. These include Docker memory limits, swapping, and cgroups, alongside

This article addresses MySQL's "unable to open shared library" error. The issue stems from MySQL's inability to locate necessary shared libraries (.so/.dll files). Solutions involve verifying library installation via the system's package m

The article discusses using MySQL's ALTER TABLE statement to modify tables, including adding/dropping columns, renaming tables/columns, and changing column data types.

This article compares installing MySQL on Linux directly versus using Podman containers, with/without phpMyAdmin. It details installation steps for each method, emphasizing Podman's advantages in isolation, portability, and reproducibility, but also

This article provides a comprehensive overview of SQLite, a self-contained, serverless relational database. It details SQLite's advantages (simplicity, portability, ease of use) and disadvantages (concurrency limitations, scalability challenges). C

This guide demonstrates installing and managing multiple MySQL versions on macOS using Homebrew. It emphasizes using Homebrew to isolate installations, preventing conflicts. The article details installation, starting/stopping services, and best pra

Article discusses configuring SSL/TLS encryption for MySQL, including certificate generation and verification. Main issue is using self-signed certificates' security implications.[Character count: 159]

Article discusses popular MySQL GUI tools like MySQL Workbench and phpMyAdmin, comparing their features and suitability for beginners and advanced users.[159 characters]


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version
Visual web development tools

ZendStudio 13.5.1 Mac
Powerful PHP integrated development environment

SublimeText3 Mac version
God-level code editing software (SublimeText3)

mPDF
mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),
