您的位置:首页 > 产品设计 > UI/UE

mysql慢查询优化步骤slow_query

2017-04-12 14:34 357 查看
慢查询分析步骤:

1,登录mysql,查看慢查询参数状态:
show variables where Variable_name in ("slow_query_log","slow_query_log_file","log_slow_slave_statements","log_slow_admin_statements","long_query_time","log_queries_not_using_indexes","log_throttle_queries_not_using_indexes","log_output"); 

1,查找mysql慢查询日志的实际位置,观察大小。

ll -lh /disk3/data/server/mysql5.7.15/data/mysql-slow.log  #通过第一步获得
如果太大(超过100M),进行文件拆分:
split -b 20m mysql-slow.log tmp_slow.log #原文件不会删除

2,

确定慢查询总数量:show global status like '%Slow_queries%';

#查询5条执行总时间最慢的语句。

mysqldumpslow -s t -t 5 mysql-slow.log  #Time=53.54s (8352s) 中的8352s,指总时间。

得到返回总记录集最多的5个SQL。

mysqldumpslow -s r -t 5 mysql_slow.log

#查询5条总锁定时间最长的语句。

mysqldumpslow -s l -t 5 mysql-slow.log 

#查询5条访问计数最多的语句。

mysqldumpslow -s c -t 5 mysql-slow.log 

其他参数:

al:平均锁定时间

mysqldumpslow -s al -t 5 mysql-slow.log 

ar:平均返回记录数

mysqldumpslow -s ar -t 5 mysql-slow.log 

at:平均查询时间

mysqldumpslow -s at -t 5 mysql-slow.log #Time=53.54s (8352s) 中的53.54s,指平均时间。

-r 倒着排序,需要配合-s使用,不能独立使用。

-a 不要将数字和字符串抽象成N和S,会从新进行分类,对sql分类更加严格。

-g 仅仅分析相匹配的query,如:mysqldumpslow -t 10 -s t -g "left join" host-slow.log

3,分析得到的sql语句。

3.1:去除无效的sql语句。如备份数据库的shell执行的语句。

3.2:确定有效语句。慢日志中查询并复试。

SELECT COUNT(N) FROM visit_trace WHERE

  UNIX_timestamp(created) >= UNIX_timestamp('S')  

  AND UNIX_timestamp(created) < UNIX_timestamp('S')  

  AND(domain = 'S'

  OR domain = 'S'

  OR domain = 'S')

通过vim或cat命令进行查找:cat slow.sql | grep -C 15 'AND UNIX_timestamp(created)' ;

需要优化查询:

SELECT 

  DATE_FORMAT(created,'%Y-%m-%d') date_form,

                 COUNT(session_id) sum_s FROM(

                SELECT * FROM visit_trace

                where   created >= '2016-11-01 19:39:20'

                AND     created <= '2016-12-01 19:39:20'

                GROUP BY session_id ) a

                GROUP BY date_form;

explain解析:

explain SELECT 

  DATE_FORMAT(created,'%Y-%m-%d') date_form,

                 COUNT(session_id) sum_s FROM(

                SELECT * FROM visit_trace

                where   created >= '2016-11-01 19:39:20'

                AND     created <= '2016-12-01 19:39:20'

                GROUP BY session_id ) a

                GROUP BY date_form;

优化1,缩减查询列:

SELECT 

  DATE_FORMAT(created,'%Y-%m-%d') date_form,

                 COUNT(session_id) sum_s FROM(

                SELECT created,session_id FROM visit_trace

                where   created >= '2016-11-01 19:39:20'

                AND     created <= '2016-12-01 19:39:20'

                GROUP BY session_id ) a

                GROUP BY date_form;

优化2,增加联合索引(created,session_id):
实际测试后发现优化效果不明显,暂时未添加。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: