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 待续...

文章目录