Mysql存储过程分析
为了搞明白为什么mysql的存储过程是高效的,我们需要理解mysql的执行流程是什么,当输入sql语句之后,mysql会先进行sql语句语法正确性检查,然后再进行编译,然后才执行,最后把结果返回。如下图所示:
普通sql语句经过mysql的引擎进行语法分析和编译之后才会执行,存储过程在第一次运行的时候也是需要语法分析和编译,但是后面再调用该存储过程不再需要语法分析和编译,这样就大大提高了sql的执行效率。
什么是存储过程?
存储过程是sql语句和控制语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程的优点:
1 增强了sql语句的功能和灵活性
2 实现较快的执行速度
3 减少了网络流量
创建存储过程
CREATE 用户 PROCEDURE 存储过程名称(参数1,参数2,...)
过程体
参数的类型有三种:IN OUT INOUT
过程体:过程体由任意的合法的sql语句组成,不包含建库建表的SQL
简单的创建存储过程案例
#创建不带参数
mysql> create PROCEDURE select_version() select version();
#创建带IN参数的
1 mysql> delimiter //
2 mysql> create procedure remove_nav(IN id int unsigned)
3 -> begin
4 -> delete from yiqi_navigate where navid=id;
5 -> end
6 -> //
7 Query OK, 0 rows affected (0.00 sec)
8 mysql> delimiter ;
9 mysql> call remove_nav(10);
注意:参数名不要跟条件名称重复,否则可能全删了。修改定界符为//,是为了过程体的语句
能正常
#创建带IN OUT的参数,IN参数是输入参数,OUT是返回的值
mysql> delimiter //
mysql> create procedure rem_nav_return(IN id int unsigned,OUT name varchar(64))
-> begin
-> delete from yiqi_navigate where navid= id;
-> select count(navid) from yiqi_navigate INTO name; 说明:select返回值赋值给name
-> end
-> //
Query OK, 0 rows affected (0.01 sec)
mysql> delimiter ;
mysql> call rem_nav_return(9,@nums); 这里的@nums是客户端变量
删除存储过程
#使用drop procedure 存储过程名
mysql> drop procedure remove_link;