MySQL 优化四(慢查询日志)(高级篇)
什么是慢查询?#
注意:默认情况下数据库没有开启慢查询日志 需要手动来设置这个参数!当然如果不需要调优的话 一般不建议启动该参数 因为开启慢查询日志会或多或少带来一定的性能影响 慢查询日志支持将日志记录写入文件
首先我们需要查看一下慢查询功能是否开启首先我们需要查看一下慢查询功能是否开启: show variables like ‘% slow_query_log%’;
会展示是否开启 以及 日志文件的位置在哪里!
开启慢查询功能:
set global slow_query_log = 1 开启了慢查询日志只对当前数据库生效 如果 mysql 重启后则会失效!
那么慢查询多慢才算是慢呢?
这个是由参数 long_query_time 控制,默认情况下 long_query_time 的值为 10 秒
查看该系统变量:show variables like ‘long_query_time%’;
默认 10s 才算慢 sql 这样是不行的 所以我们设置一下慢的阙值时间:
set global long_query_time=3;
显示设置成功了 但是我们再去查看阙值但是还是 10 秒 为什么呢?
这是因为我们需要重新连接 mysql 或者新开一个会话才能看到修改值!
因为没有真实环境 我们选择一个库比如用 zhishi 数据库 然后模拟慢 sql
select sleep (4);// 表示 4 秒之后再执行
那么执行完成会后就会在慢查询 sql 日志当中有记录了
在哪个数据库 真实执行时间 以及 是哪条 sql 就被记录了下来!
然后我们有针对性的去找到这些慢 sql 去进行 explain 分析 然后去调优创建索引
如何查看我的慢 sql 日志当中有多少条慢 sql 呢?
show global status like ‘%Slow_queries%’;
目前表示有一条慢 sql!
一般不建议长期开启慢 sql 如果要长期开启慢 sql 那么 mysql.ini 当中配置如下:
show profile:#
我们开启了慢查询可能会有很多慢 sql 语句 但是我们想要知道具体的慢的原因是什么?是链接的时候慢还是 sql 优化器部分慢还是咋地回事呢?就可以用到 show profile 来进行单条 sql 的具体分析是什么?是 mysql 提供可以用来分析当前会话中语句执行的资源消耗情况 可以用于 sql 的调优测量默认情况下 参数处于关闭状态 并保存最近 15 次的运行结果
首先查看 show profile 状态
show variables like ‘profiling’;
开启 show profile
set profiling = on;
当我们开启了之后 那么我们在数据库上执行的任何的 sql 语句都会被记录来
我们只需要执行 show profiles;
那么我们在 mysql 当中执行过的 sql 都暴露了出来 并且包含该条 sql 执行的时长是多少!
比如现在我们看到 show profiles 的结果集当中有一条 sql 的执行时间较长 那么我们就可以通过:
show profile cpu,block io for query 这里放我们上边找到执行时间长的对应的 query_id 的值 //sql 慢要么是 cpu 计算复杂 要么是 io 频繁开销所以我们只看 cpu 和 block io 即可!
show profile cpu,block io fro query 6; 然后我们就看到了整条 sql 的声明周期
这个声明周期怎么看呢?主要是看 status 如果出现下图当中的四种情况 那么这条 sql 一定是惹事了
我们来看一下执行时长 3s 以上的 sql 的声明周期 我们会发现存在上图四种当中的情况发生 说明该条 sql 一定是有问题的 sql;
查询截取分析:
1. 观察 至少跑一天 看看生成的慢 sql 情况
2. 开启慢查询日志,设置阙值 比如超过 5S 钟的就是慢 sql 并将它抓取出来
3.explain + 慢 sql 分析
4.show profile
5. 运维经理或者 DBA 进行 sql 服务器的参数调优
总结:
a. 慢查询的开启和捕获
b.explain + 慢 sql 分析
c.show profile 查询 sql 在 mysql 服务器里面的执行细节和声明周期
4.sql 数据库服务器的参数调优 这是 dba 的活 占时不研究啦吧 4.sql 数据库服务器的参数调优 这是 dba 的活 占时不研究啦吧
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: