# 存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
# 存储过程特点
有输入输出参数,可以声明变量,有 if/else, case,while 等控制语句,通过编写存储过程,可以实现复杂的逻辑功能
函数的普遍特性:模块化,封装,代码复用
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;
# 存储过程创建于调用
- 创建无参存储过程
1 | create procedure userPorced () |
- 调用存储过程
1 | call userPorced (); |
- 创建有参存储过程
1 | create procedure userPorced ( in a int(10) ) |
- 调用存储过程
1 | call userPorced (10); |
# 存储过程优缺点
- 优点
- 在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或 bug),而不用重启服务器。
- 执行速度快。存储过程经过编译之后会比单独一条一条执行要快。
- 减少网络传输。存储过程直接就在数据库服务器上跑,所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。
- 缺点
- SQL 本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是 OO 的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。这一点算致命伤。
- 不便于调试。
- 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。
- 无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。
# 慢查询
概念:MySQL 默认 10 秒内没有响应 SQL 结果,则为慢查询,可以去修改 MySQL 慢查询默认时间
慢查询的修改有查看:
查看慢查询的时间 show variables like ‘long_query_time’;
修改慢查询的时间 set long_query_time=1; (重启后失效)
# 将慢查询写入日志
MySQL 慢查询的相关参数解释:
-
slow_query_log :是否开启慢查询日志,1 表示开启,0 表示关闭。
-
log-slow-queries :旧版(5.6 以下版本)MySQL 数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件 host_name-slow.log
-
slow-query-log-file:新版(5.6 及以上版本)MySQL 数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件 host_name-slow.log
-
long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。
-
log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
-
log_output:日志存储方式。log_output=’FILE’表示将日志存入文件,默认值是’FILE’。log_output=’TABLE’表示将日志存入数据库,这样日志信息就会被写入到 mysql.slow_log 表中。MySQL 数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=’FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件。
开启慢查询日志: set global slow_query_log=1(重启后失效)
修改 my.cnf 文件方式:
1 | slow_query_log =1 |
log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用 full index scan 的 sql 也会被记录到慢查询日志。
log_slow_admin_statements: 表示是否将慢管理语句例如 ANALYZE TABLE 和 ALTER TABLE 等记入慢查询日志
- show status
1 | mysql数据库启动了多少时间 |
1 | show [session|global] status like .... |
显示到 mysql 数据库的连接数
1 | show status like 'connections '; |
显示慢查询次数
1 | show status like 'slow_queries'; |