找出mysql中的慢查询
本周开始要调研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是要优化的