1. 开启慢查询日志
(1)首先我们要创建一个文件夹用于保存慢查询日志文件,并且设置 mysql 有权读写该目录:
|
|
(2)我们可以登入 mysql 命令行后执行如下命令,使用 set 设置变量来临时开启。注意这种方式重启服务即失效。
|
|
(3)或者我们也可以通过修改配置文件来永久开启慢查询日志功能,首先编辑配置文件:
|
|
- 然后在里面添加如下高亮配置:
|
|
- 保存关闭文件后,执行如下命令重启 mysql 即可:
|
|
2. 查看慢查询功能是否开启
(1)登入 mysql 命令行后执行如下命令可以查看慢查询开启状态,以及慢查询日志存放的位置:
|
|
(2)执行如下命令可以查看查询超过多少秒才记录:
|
|
3. 慢查询测试
(1)首先我们执行一个如下的 sql,模拟一个 2 秒的慢查询:
|
|
(2)查看日志可以发现这个慢查询已经被记录:
|
|
使用 pt-query-digest 工具分析慢查询日志
1,工具安装
(1)首先我们执行如下命令将 rpm 包下载到本地:
注意:如果下载不下来也可访问其官网(点击打开),手动下载下来再上传到服务器上。
|
|
(2)接着使用 yum 命令进行安装:
|
|
2. 分析慢查询日志
(1)执行如下命令可以分析指定的慢查询日志文件:
|
|
(2)分析结果分为三部分,第一部分是总体统计结果:
- Overall:总共有多少条查询
- Time range:查询执行的时间范围
- unique:唯一查询数量,即对查询条件进行参数化以后,总共有多少个不同的查询
- total:所有查询总计时长
- min:所有查询最小时长
- max:所有查询最大时长
- avg:所有查询平均时长
- 95%:把所有时长值从小到大排列,位置位于 95% 的那个时长数,这个数一般最具有参考价值
- median:中位数,把所有时长值从小到大排列,位置位于中间那个时长数
(3)第二部分是查询分组统计结果:
- Rank:所有语句的排名,默认按查询时间降序排列,通过 –order-by 指定
- Query ID:语句的 ID(去掉多余空格和文本字符,计算 hash 值)
- Response:总的响应时间
- time:该查询在本次分析中总的时间占比
- Calls:执行次数,即本次分析总共有多少条这种类型的查询语句
- R/Call:平均每次执行的响应时间
- V/M:响应时间 Variance-to-mean 的比率
- Item:查询对象
(4)第三部分是每一种查询比较慢的 sql 的详细统计结果:
- pct:该 sql 语句某执行属性占所有慢查询语句某执行属性的百分比
- total:该 sql 语句某执行属性的所有属性时间。
- Count:sql 语句执行的次数。对应的 pct 表示此 sql 语句执行次数占所有慢查询语句执行次数的 % 比(下图为 10%),对应的 total 表示总共执行了 3 次。
- Exec time:sql 执行时间
- Lock time:sql 执行期间被锁定的时间
- Rows sent:传输的有效数据,在 select 查询语句中才有值
- Rows examine:总共查询的数据,非目标数据。
- Query_time distribution:查询时间分布
- SQL 语句:下图中为 select sleep(7)\G
3. 进阶用法
(1)分析 slow.log 日志,并将分析报告输入到 slow_report.log 中:
|
|
(2)分析最近 12 小时内的查询:
|
|
(3)分析指定时间范围内的查询:
|
|
(4)分析指含有 select 语句的慢查询:
|
|
(5)针对某个用户的慢查询:
|
|
(6)查询所有的全表扫描或 full join 的慢查询:
|
|
(7)把查询保存到 query_review 表:
|
|
(8)通过 tcpdump 抓取 mysql 的 tcp 协议数据,然后再分析:
|
|
(9)分析 binlog:
|
|
(10)分析 general log:
|
|