MySQL性能优化实践( 二 )


注意: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:查询数据的操作类型,其值如下: