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 协议》,转载必须注明作者和本文链接
胡军
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!