1.发现问题
【1】配置mysql慢查询日志
//mysql默认关闭慢查询日志,用以下配置打开
set global slow_query_log = [on | off ];
//设置慢查询日志的路径
set global slow_query_log_file = sql_log/slowlog.log
//当sql执行时间超过该设置时间时,就会进入慢查询,想要直接开始慢查询,可设置长查询时间为0
set global long_query_time = xx.xxx秒
set global long_queries_not_using_indexes=[on|off]
若我们设置长查询为0.001s,那么每天就会产生大量的慢查询日志,那么我们人工查询就是很困难的事情。那么如何高效的分析慢查询日志?
【2】分析mysql慢查询日志
把查询日志当做参数,调用mysqldumpslow [OPTS…][LOGS…]命令行工具即可。或者使用pt-query-digest [OPTIONS] [FILES] [DSN]命令行工具。
安装percona-toolkit工具包之后:
mysql> show variables like 'long_query_time';//查看一下长查询时间:默认10s
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
mysql> set global long_query_time = 0;//设置长查询时间为0,工作中一般设置为0.001
mysql> show variables like 'slow_query_log' ;//查看慢查询日志,默认关闭
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
mysql> set global slow_query_log = on;//打开慢查询日志
mysql> show variables like 'slow_query_log_file';//查看慢查询日志路径
+---------------------+-------------------------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------------------------+
| slow_query_log_file | /var/lib/mysql/izbp173bkvqwhsk998g7scz-slow.log |
+---------------------+-------------------------------------------------+
//进入该目录下,打开该文件可以看到慢查询日志
cd /var/lib/mysql/
more izbp173bkvqwhsk998g7scz-slow.log
//使用mysqldumpslow分析结果
mysqldumpslow izbp173bkvqwhsk998g7scz-slow.log
//使用pt-query-digest分析
pt-query-digest izbp173bkvqwhsk998g7scz-slow.log
【3】分析执行计划
explain:分析执行计划,可以跟select/delete/update/insert/replace语句
(1)id列
explain
select course_id,class_name,level_name,title,study_cnt
from imc_course a
join imc_class b on a.class_id = b.clss_id
join imc_level c on c.level_id = a.level_id
where study_cnt > 3000;
explain
select a.course_id,.title
from imc_course a
where a.course_id not in (select course_id from imc_chapter b);
(2)select_type列
(3)table列
(4)partitions列
(5)type列
id=1:即第一个select语句
对c表即imc_level和a表即imc_course进行全表扫描;
对b表进行eq_ref扫描:索引b.class_id=a.class_id
id=2:即第2个select语句
对b表中:where class_name = ‘mysql’ ,为常量,故对b表进行const扫描
对a表进行ref扫描:a.class_id=b.class_id 和 a.level_id = c.level_id
(6)possible_key列、key列、key_len列
(7)ref列
(8)rows列、filtered列
(9)Extra:额外信息
(10)案例
type常量const查询以及ref为const:user_id=1;
key_len=4:user_id为int类型。
rows=1:预估扫描行数
filtered:返回结果行数/读取行数