让mysql慢慢起飞 - 初识慢日志
mysql优化的话,我一般会这样入手,从一个接口响应时间来说,如果响应时间超过1s,肯定是要优化的,保证网络问题ok的情况下,可进行如下调试:
1.先定位响应时间长的代码段
可逐行注释,直接返回,如果当打开某一行代码时,发现速度明显变慢,即可确定当前代码拖慢了时间。
为什么不直接看慢日志呢?
因为程序中可能是各种小查询组合起来的,慢日志中看不到超时的sql语句
2.慢日志定位sql语句
开启慢日志,修改my.cnf文件
#安全模式修改,兼容老版本group
[mysqld]
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#慢日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/mysql-slow.log
long_query_time = 1 #单位s,可设置为0.1
上线前推荐
将慢日志参数long_query_time
改为0,保证记录所有sql语句,然后走一遍测试环境,之后查看慢日志文件,来辅助修改和优化索引项
查看慢日志文件记录的sql
mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with:
Tcp port: 0 Unix socket: /var/run/mysqld/mysqld.sock
Time Id Command Argument
# Time: 2020-02-25T15:25:10.543384Z
# User@Host: root[root] @ [172.23.0.1] Id: 2
# Query_time: 1.352161 Lock_time: 0.033811 Rows_sent: 10000 Rows_examined: 10000
use bbs_base;
SET timestamp=1582644310;
select `id`, `name`, `avatar` from `users` where `users`.`id` in (1520076, 1520081, 1520090);
使用pt-query-digest工具分析
执行命令:
/usr/local/percona-toolkit/bin/pt-query-digest ~/docker-volumes/mysql/log/mysql-slow.log
显示结果:
# Query 2: 0.06 QPS, 0.03x concurrency, ID 0x3EE6E67A63457E7BF53837C718CB40F0 at byte 90923
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.38
# Time range: 2020-02-25T16:02:46 to 2020-02-25T16:03:20
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 40 2
# Exec time 32 1s 236ms 890ms 563ms 890ms 462ms 563ms
# Lock time 0 209us 79us 130us 104us 130us 36us 104us
# Rows sent 49 19.53k 9.77k 9.77k 9.77k 9.77k 0 9.77k
# Rows examine 6 19.53k 9.77k 9.77k 9.77k 9.77k 0 9.77k
# Query size 0 410 205 205 205 205 0 205
# String:
# Databases bbs_base
# Hosts 172.24.0.1
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms ################################################################
# 1s
# 10s+
# Tables
# SHOW TABLE STATUS FROM `bbs_base` LIKE 'topics'\G
# SHOW CREATE TABLE `bbs_base`.`topics`\G
# EXPLAIN /*!50100 PARTITIONS*/
select `id`, `title`, `excerpt`, `user_id`, `category_id`, `reply_count`, `view_count`, `create_time` from `topics` where `delete_time` = 0 and ((`category_id` = 1)) order by `id` desc limit 10000 offset 0\G
3.小结
本章讲了,如何开启慢日志,查看慢日志,还简单介绍了慢日志分析工具,pt-query-digest
,还说到在上线前要做的一件很重要的事情,通过修改参数long_query_time = 0
,记录所有sql,来反过来辅助你修改和优化索引,下一次更新,将介绍slow.log中每一行的意思,good luck
待续...
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
评论已关闭