找出mysql中的慢查询

语言: CN / TW / HK

本周开始要调研MySQL应用优化,在短时间无法做到结构性的改造,但可以从慢查询作为引子。

慢查询的原因源于数据量大小、索引设计、数据库schema设计。在找到慢查询后,根据2/8原则,快速调整索引、应用调优,花较少的时间解决大部分性能问题,至少多争取一些时间。

MySQL本身有一些配置和工具检测慢查询。

如何配置慢查询参数

直接上配置:

set global  slow_query_log = on
set global long_query_time = 1

show global variables like '%slow_query_log%';
set global slow_query_log_file='/data/slow-3306-040609';

show global variables like '%log_queries_not_using_indexes%';
set global log_queries_not_using_indexes = on

show global variables like '%min_examined_row_limit%'

show global variables like 'log_slow_slave_statements';

set global  min_examined_row_limit=200;

比较陌生的是log_slow_slave_statements,表示从库同步的慢查询也记录;min_examined_row_limit表示扫描记录数少于200的不计入慢查询;log_queries_not_using_indexes这个挺重要的,没有使用索引的语句也会记录日志中。

mysqldumpslow

mysqldumpslow 工具可以分析慢查询日志,比如;

得到平均访问次数最多的20条sql:

mysqldumpslow  -r -s ar -t 20  /data/slow-3306-040609

按照查询时间找出最慢的20条sql:

mysqldumpslow -s ar -t 20   /data/slow-3306-040609

找出锁定时间最长的20条sql:

mysqldumpslow -s al -t 20   /data/slow-3306-040609

找出访问次数最多的20条sql:

mysqldumpslow -s c -t 20  /data/slow-3306-040609

数字不转换为N,字符串不转换为S,这样能够得到详细的语句:

mysqldumpslow -a  -t 20  /data/slow-3306-040609

根据正则匹配sql:

mysqldumpslow -g "正则"  /data/slow-3306-040609

策略

  • 扫描行数较多的sql是要优化的
  • 平均响应时间较大的sql是要优化的
  • 访问次数较多的sql是要优化的
  • lock时间较多的sql是要优化的
分享到: