文章目录
- MySQL存储过程
- 一.MySQL存储过程
- 1.概述
- 2.简介
- 3.存储过程中的控制结构及应用场景
- 4.存储过程的优点
- 5.存储过程语法
- 6.不带参数创建(示例)
- 6.1 创建存储过程
- 6.2 调用存储过程
- 6.3 查看存储过程
- 6.4 存储过程的参数
- 7.实例
- 8.修改存储过程
- 9.删除存储过程
- 总
- mysql 优化
MySQL存储过程
一.MySQL存储过程
1.概述
MySQL 相关知识都是针对一个表或几个表的单条 SQL 语句,使用这样的SQL语句虽然可以完成用户的需求,但在实际的数据库应用中,有些数据库操作可能会非常复杂,可能会需要多条 SQL 语句一起去处理才能够完成,这时候就可以使用存储过程,轻松而高效的去完成这个需求,有点类似she11脚本里的函数。
2.简介
(1)存储过程是一组为了完成特定功能的SQL语句集合。
(2)存储过程这个功能是从5.0版本才开始支持的,它可以加快数据库的处理速度,增强数据库在实际应用中的灵活性。
(3)存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用一个指定的名称存储起来,这个过程经编译和优化后存储在数据库服务器中。
(4)当需要使用该存储过程时,只需要调用它即可。操作数据库的传统 SQL语句在执行时需要先编译,然后再去执行,跟存储过程一对比,明显存储过程在执行上速度更快,效率更高。
3.存储过程中的控制结构及应用场景
存储过程在数据库中 创建并保存,它不仅仅是SQ语句的集合,还可以加入一些特殊的控制结构,也可以控制数据的访问方式。存储过程的应用范围很广例如封装特定的功能、 在不同的应用程序或平台上执行相同的函数等等。
4.存储过程的优点
(1)执行一次后,会将生成的二进制代码驻留缓冲区,提高执行效率
(2)SQL语句加上控制语句的集合,灵活性高
(3)在服务器端存储,客户端调用时,降低网络负载
(4)可多次重复被调用,可随时修改,不影响客户端调用
(5)可完成所有的数据库操作,也可控制数据库的信息访问权限
5.存储过程语法
CREATE PROCEDURE <过程名> ([过程参数[,…] ])<过程体>
[过程参数[,…] ] 格式
<过程名>: 尽量避免与内置的函数或字段重名
<过程体>: 语句
[ IN I OUT I INOUT ]<参数名><类型>
6.不带参数创建(示例)
6.1 创建存储过程
#将语句的结束符从分号;临时改为两个$$(可自定义)
mysql> delimiter $$
#创建存储过程,过程名为proc,不带参数
mysql> create procedure proc()
#以关键字begin开始-> begin
#存储过程中有哪些参数-> create table xx (id int (10), name char(10),score int (10));
#插入数据-> insert into xx values (1,'hmbb',18);
#过程体语句-> select * from xx;
#过程体以关键字end结束-> end $$
Query OK, 0 rows affected (0.02 sec)
#讲语句的结束符号恢复为分号
delimiter ;
6.2 调用存储过程
call proc();
存储过程的主体都分,被称为过程体
以BEGIN开始,以END结束,若只有一条sQL语句,则可以省略BEGIN-END
以DELIMITER开始和结束
#$$是用户自定义的结束符
mysql> delimiter $$
#分号前有空格
mysql>DELIMITER ;
6.3 查看存储过程
(1)格式
#查看某个存储过程的具体信息
SHOW CREATE PROCEDURE [数据库.]存储过程名;
(2)示例
mysql> show create procedure proc\G
*************************** 1. row ***************************Procedure: procsql_mode: PIPES_AS_CONCAT,ANSI_QUOTES,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONCreate Procedure: CREATE DEFINER="root"@"localhost" PROCEDURE "proc"()
begin
create table xx (id int (10), name char(10),score int (10));
insert into xx values (1,'hmbb',18);
select * from xx;
end
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)
#查看存储过程
SHOW PROCEDURE STATUS
#查看指定存储过程信息
mysql> SHOW PROCEDURE STATUS like '%proc%'\G
*************************** 1. row ***************************Db: className: procType: PROCEDUREDefiner: root@localhostModified: 2023-07-20 14:56:12Created: 2023-07-20 14:56:12Security_type: DEFINERComment:
character_set_client: utf8
collation_connection: utf8_general_ciDatabase Collation: utf8_general_ci
1 row in set (0.00 sec)
6.4 存储过程的参数
(1)IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量)
(2)OUT 输出参数:表示过程向调用者传出值(可以返回多个值)(传出值只能是变量)
(3)INOUT 输入输出参数:既表示调用者向过程传入值,又表示过程向调用者传出值(值只能是变量)
7.实例
mysql> delimiter @@
mysql> create procedure proc2 (in inname varchar(40))-> begin-> select * from info where name=inname;-> end @@
Query OK, 0 rows affected (0.00 sec)mysql> delimiter ;
mysql> call proc2('wangwu');
+------+--------+--------+------------+--------+------+
| id | name | score | address | hobbid | addr |
+------+--------+--------+------------+--------+------+
| 2 | wangwu | 120.00 | shengzheng | 2 | |
+------+--------+--------+------------+--------+------+
1 row in set (0.00 sec)Query OK, 0 rows affected (0.00 sec)
8.修改存储过程
(1)格式
ALTER PROCEDURE <过程名>[<特征>... ]
(2)示例
ALTER PROCEDURE GetRole MODIFIES SQL DATA SQL SECURITY INVOKER;
MODIFIES SQLDATA:表明子程序包含写数据的语句
SECURITY:安全等级
invoker:当定义为INVOKER时,只要执行者有执行权限,就可以成功执行。
9.删除存储过程
存储过程内容的修改方法是通过删除原有存储过程,之后再以相同的名称创建新的存储过程。
DROP PROCEDURE IF EXISTS Proc;
总
mysql 优化
MySQL 的性能优化可以从以下几个方面入手:
(1)数据库的逻辑设计
- 合理的表结构设计,包括表之间的关系和索引设计等
- 避免使用不必要的关联查询和子查询
- 避免使用不必要的交叉表查询、全表扫描等操作
(2)系统配置优化
- 适当增加系统内存、硬盘、CPU 等硬件设施
- 优化 MySQL 的配置,如应用正确的缓存、调整 MySQL 配置参数等
(3)SQL 查询优化
- 使用正确的索引,优先使用覆盖索引
- 尽量避免在 SQL 中使用算法处理或函数操作
- 通过分析慢查询日志、MySQL Explain 等实现优化。
(4)连接池和缓存的使用
- 合理设置连接池参数,例如连接池大小、最大连接数
- 通过缓存技术减少对数据库的访问次数,如使用 Redis 等内存数据库进行缓存
(5)确保 MySQL 的安全稳定
- 及时进行备份和恢复操作,保证数据的完整性和可靠性
- 开启 MySQL 的事务管理,确保数据库操作的原子性和一致性
- 使用安全的 SQL 编写方式,如避免 SQL 注入、拒绝服务攻击、暴力破解等攻击。
需要注意的是,MySQL 的性能优化是一个综合性的工作;不同的业务场景、不同的数据库规模都会有不同的优化方案,具体实现也应根据具体情况来进行调整和优化。调优时应注意造成性能问题的原因,重点突破站在性能问题的源头进行优化调整。