注意:slowquerylog_file 的路径不能随便写,否则 MySQL 服务器可能没有权限将日志文件写到指定的目录中 。建议直接复制上文的路径 。
修改保存文件后,重启 MySQL 服务 。在 /var/lib/mysql/ 目录下会创建 slow-query.log 日志文件 。连接 MySQL 服务端执行如下命令可以查看配置情况 。
show variables like 'slow_query%';show variables like 'long_query_time';测试慢查询日志:
mysql> select sleep(2);+----------+| sleep(2) |+----------+| 0 |+----------+1 row in set (2.00 sec)打开慢查询日志文件
[root@localhost mysql]# vim /var/lib/mysql/slow-query.log/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:Tcp port: 0 Unix socket: /var/lib/mysql/mysql.sockTime Id Command Argument# Time: 2017-10-05T04:39:11.408964Z# User@Host: root[root] @ localhost [] Id: 3# Query_time: 2.001395 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0use test;SET timestamp=1507178351;select sleep(2);我们可以看到刚才执行了 2 秒的 SQL 语句被记录下来了 。
虽然在慢查询日志中记录查询慢的 SQL 信息,但是日志记录的内容密集且不易查阅 。因此,我们需要通过工具将 SQL 筛选出来 。
MySQL 提供 mysqldumpslow 工具对日志进行分析 。我们可以使用 mysqldumpslow --help 查看命令相关用法 。
常用参数如下:
-s:排序方式,后边接着如下参数 c:访问次数 l:锁定时间 r:返回记录 t:查询时间 al:平均锁定时间 ar:平均返回记录书 at:平均查询时间 -t:返回前面多少条的数据 -g:翻遍搭配一个正则表达式,大小写不敏感案例:
获取返回记录集最多的10个sqlmysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log获取访问次数最多的10个sqlmysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log获取按照时间排序的前10条里面含有左连接的查询语句mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log
五、分析 SQL 语句
5.1 方式一:explain筛选出有问题的 SQL,我们可以使用 MySQL 提供的 explain 查看 SQL 执行计划情况(关联表,表查询顺序、索引使用情况等) 。
用法:
explain select * from category;返回结果:
mysql> explain select * from category;+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+| 1 | SIMPLE | category | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+1 row in set, 1 warning (0.00 sec)字段解释:1) id:select 查询序列号 。id相同,执行顺序由上至下;id不同,id值越大优先级越高,越先被执行
2) select_type:查询数据的操作类型,其值如下:
- simple:简单查询,不包含子查询或 union
- primary:包含复杂的子查询,最外层查询标记为该值
- subquery:在 select 或 where 包含子查询,被标记为该值
- derived:在 from 列表中包含的子查询被标记为该值,MySQL 会递归执行这些子查询,把结果放在临时表
推荐阅读
- CentOS7下yum方式安装MySQL5.7数据库
- MySQL必须要掌握的常用查询语句
- SpringBoot+Mysql做登陆接口,抛弃mapper.xml
- MySQL多表查询讲解
- 记一次 MySQL 复制故障-Error_code:1317
- MySQL数据迁移到TiDB的流程及为何放弃MyCat
- 借助工具优化Dockerfile分层
- 性能优化技巧 - 查找
- 一文彻底读懂MySQL事务的四大隔离级别
- MySQL 5.7中需要考虑的几个参数
