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):
实际测试后发现优化效果不明显,暂时未添加。
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):
实际测试后发现优化效果不明显,暂时未添加。
相关文章推荐
- MySQL:动态开启慢查询日志(Slow Query Log)
- mysql 慢查询日志(slow_query_log_file)切换
- 使用pt-query-digest分析mysql慢查询日志(mysql slow query log )
- MySQL 优化之 Slow Query Log
- mysql慢查询Slow Query Log和未使用索引(Not Using Indexes)查询配置和使用
- MySQL SQL优化案例:相关子查询(dependent subquery)优化
- 开启mysql查询日志 mysql——slow query log
- MySQL错误日志(error log),二进制日志(binlog),慢查询日志(slow query log),查询日志(general log),重写日志(redo log)
- mysql性能优化-查询(Query)优化-1
- mysql性能优化-查询(Query)优化-2
- MySQL 慢查询日志(Slow Query Log)
- mysql dba系统学习(9)slow query log慢查询日志功能
- MySQL limit查询优化的实际操作步骤
- mysql中的查询优化步骤
- MySQL专题 2 数据库优化 Slow Query log
- MySQL开启慢查询日志slow_query_log
- mysql5.6.10关于慢查询的设置slow-query-log
- MySQL 慢查询日志(Slow Query Log)