怎样定位mysql中执行效率差的SQL语句/查询mysql中执行过的慢sql语句?

慢查询日志概念

mysql慢查询日志是mysql日共记录日志的一种也是帮助定位查询较慢的sql的一种手段,他用来记录超过long_query_time设定值的sql,超过这个阀值mysql就会将其记录下来,写进slow_query_log_file配置好的日志文件中。默认的情况下mysql是关闭慢查询的功能的,因为开启慢查询功能会消耗一部分的系统资源,所以一般来说我们的生产环境也是不建议开启的。
涉及部分相关参数:

  • slow_query_log :是否开启慢查询日志,1表示开启,0表示关闭。当我们有些版本的数据库也会用“on”或者“off”
  • log-slow-queries
    :旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
  • long_query_time :慢查询阈值,当查询时间多于设定的阈值时,记录日志。默认值10s
  • log_queries_not_using_indexes:未使用索引的查询也被记录到慢查询日志中(可选项)。
  • log_output:日志存储方式。log_output=‘FILE’表示将日志存入文件,默认值是’FILE’。log_output='TABLE’表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。MySQL数据
    库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output=‘FILE,TABLE’。日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需
    要能够获得更高的系统性能,那么建议优先记录到文件。

慢查询设置

1、日志式
mysql默认情况下slow_query_log的值时“OFF”也就是关闭状态。在我我们定位一下慢sql的时候需要先查看当前状态可以通过查询VARIABLES查看相关参数例如
查看设置:

show VARIABLES like "%QUERY%"; --查看参数名称中带有“QUERY”的参数
show VARIABLES like "%log_output%"; --查看参数名称中带有“log_output”的参数

修改设置:set GLOBAL [key]=[value]

set GLOBAL slow_query_log=`ON`; --此方式只对当前生效,一旦数据库重启便会失效

永久生效:修改my.cnf配置文件增加参数或修改参数重启服务器即可

slow_query_log=ON
long_query_time=10
slow_query_log_file=/usr/local/mysql/data/localhost-slow.log

#慢查询的参数slow_query_log_file ,它指定慢查询日志文件的存放路径,系统默认会给一个缺省的文件host_name-slow.log

2、表格式
log_output参数适用来指定日志的存储方式的参数,他是一个枚举类型,有“FILE”和“TABLE”两个值。默认值为“FILE”。当然mysql也支持两种方式中间用逗号隔开log_output=‘FILE,TABLE’。但是一般来说我们统一建议时将日志记录到日志文件中,因为相较于记录到日志表来说。记录到日志文件要节省性能些,但是我们更希望的是关闭
查看设置

show VARIABLES like "%log_output%"; --查看参数名称中带有“log_output”的参数

修改设置

set GLOBAL log_output=`FILE`; --此方式只对当前生效,一旦数据库重启便会失效,需要的话在配置文件中增加或修改

如果是记录到表格中的话可以通过普通的sql查询你符合条件的记录:
在这里插入图片描述
其他
系统参数log_queries_not_using_indexes在你进行调优的时候也是一个不可多得的一个参数,他可以开启或者关闭是否记录没有使用索引的慢sql。默认情况下是关闭状态(“OFF”)。
在这里插入图片描述

系统参数log_show_admin_statements表示的是是否将慢管理语句例如ANALYZE TABLE和ALTER TABLE等记入慢查询日志

show variables like 'log_slow_admin_statements';

在这里插入图片描述

统计慢查询的条数:

show global status like '%slow_queries%';

mysql日志分析工具
在实际的使用过程中我们要定位慢sql有时候需要去真是的生产环境中分析日志,所以一般来说我们都会以日志文件的形式记录慢sql,但是这样的话我们分析的工作就变的体力活了。所以我们的mysql给我们提供了日志分析工具mysqldumpslow。这个工具可以大幅度的提高我们的分析效率。

mysqldumpslow参数解析:
在这里插入图片描述

-s, 是表示按照何种方式排序
    c: 访问计数
    l: 锁定时间
    r: 返回记录
    t: 查询时间
    al:平均锁定时间
    ar:平均返回记录数
    at:平均查询时间
-t,top n的意思,即为返回前面多少条的数据;
-g, 后边可以写一个正则匹配模式,大小写不敏感的;

比如:
得到返回记录集最多的10个SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到访问次数最多的10个SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照时间排序的前10条里面含有左连接的查询语句。

mysqldumpslow -s t -t 10 -g “left join/database/mysql/mysql06_slow.log

另外建议在使用这些命令时结合 | 和more 使用 ,否则有可能出现刷屏的情况。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章