# 存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的 SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升

# 存储过程特点

有输入输出参数,可以声明变量,有 if/else, case,while 等控制语句,通过编写存储过程,可以实现复杂的逻辑功能
函数的普遍特性:模块化,封装,代码复用
速度快,只有首次执行需经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤;

# 存储过程创建于调用

  • 创建无参存储过程
1
2
3
4
create procedure userPorced ()
begin
select name from users;
end;
  • 调用存储过程
1
call  userPorced ();
  • 创建有参存储过程
1
2
3
4
create procedure userPorced ( in a int(10) )
begin
select name from users where age>a;
end;
  • 调用存储过程
1
call  userPorced (10);

# 存储过程优缺点

  • 优点
  1. 在生产环境下,可以通过直接修改存储过程的方式修改业务逻辑(或 bug),而不用重启服务器。
  2. 执行速度快。存储过程经过编译之后会比单独一条一条执行要快。
  3. 减少网络传输。存储过程直接就在数据库服务器上跑,所有的数据访问都在服务器内部进行,不需要传输数据到其它终端。
  • 缺点
  1. SQL 本身是一种结构化查询语言,加上了一些控制(赋值、循环和异常处理等),但不是 OO 的,本质上还是过程化的,面对复杂的业务逻辑,过程化的处理会很吃力。这一点算致命伤。
  2. 不便于调试。
  3. 没办法应用缓存。虽然有全局临时表之类的方法可以做缓存,但同样加重了数据库的负担。
  4. 无法适应数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。

# 慢查询

概念: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
2
3
slow_query_log =1

slow_query_log_file=/tmp/mysql_slow.log

log-queries-not-using-indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。如果调优的话,建议开启这个选项。另外,开启了这个参数,其实使用 full index scan 的 sql 也会被记录到慢查询日志。

log_slow_admin_statements: 表示是否将慢管理语句例如 ANALYZE TABLE 和 ALTER TABLE 等记入慢查询日志

  • show status
1
2
3
4
5
6
7
mysql数据库启动了多少时间

show status like 'uptime';
show stauts like 'com_select'
show stauts like 'com_insert'
...类推
update delete(显示数据库的查询,更新,添加,删除的次数)
1
2
3
4
show [session|global] status like .... 
如果你不写 [session|global] 默认是session 会话,指取出当前窗口的执行,
如果你想看所有(从mysql 启动到现在,则应该 global)

显示到 mysql 数据库的连接数

1
show status like  'connections ';

显示慢查询次数

1
2
show status like 'slow_queries';