mysql慢查询优化步骤slow_query

来源:互联网 发布:选择公理 知乎 编辑:程序博客网 时间:2024/06/05 01:01
慢查询分析步骤:
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):
实际测试后发现优化效果不明显,暂时未添加。
0 0
原创粉丝点击