一、慢查询日志
- MYSQL的满查询日志,用来记录在MYSQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中
- long_query_time默认值是10s
- 帮助定位执行时间较长的SQL查询,再通过EXPLAIN来分析,从而定位问题
- 默认MYSQL没有开启慢查询日志,需要手动开启。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会对性能带来一定影响
1. 开启慢查询
SHOW VARIABLES LIKE '%slow_query_log%';
SET GLOBAL slow_query_log = on;
SHOW VARIABLES LIKE '%long_query_time%';
SET global long_query_time = 1;
SET long_query_time = 1;
[mysqld]
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/erick-slow.log
long_query_time=3
long_output=FILE
2. 分析
SHOW status LIKE '%slow_queries%';
二、EXPLAIN
- EXPLAIN 一个SQL时,SQL并不会真正的去执行,只是去进行了执行计划分析
EXPLAIN SELECT * FROM cnip;
DESCRIBE SELECT * FROM cnip;
1. Table
- 表名,查询的每一行记录都对应一个单表
- 涉及到几个表,就会有几行记录
EXPLAIN SELECT * FROM cnip INNER JOIN employee e on cnip.name = e.name;
EXPLAIN SELECT * FROM cnip;
![在这里插入图片描述](https://img-blog.csdnimg.cn/f59d24348aa94d34a46b23cb8a7c6ec6.png)
2. id
- 在一个大的查询语句中,每个SELECT关键字都对应一个唯一的id
- 所以上面就会有两个相同的为1的id
EXPLAIN SELECT * FROM cnip UNION SELECT * FROM cnip;
![在这里插入图片描述](https://img-blog.csdnimg.cn/6a3cb5bee3a64e3f86941c1aa1ae0ef6.png)
- id如果相同,可以认为是一组,从上往下顺序执行
- 在所有组中,id值越大, 优先级越高,越先执行
- id号每个号码,表示一趟独立的查询,一个sql的查询越少越好
3. select_type
- mysql为每个SELECT关键字代表的小查询定义了该属性,知道小查询的select_type,就知道小查询在整个大查询中扮演的角色
EXPLAIN SELECT * FROM cnip;
EXPLAIN SELECT * FROM cnip INNER JOIN employee ;
4. Type
- 执行计划的一条记录代表MYSQL对某个表的执行查询时的访问方法
- 针对单表的访问方法
EXPLAIN SELECT * FROM cnip WHERE id = 10;
EXPLAIN SELECT * FROM cnip INNER JOIN s2 ON cnip.id=s2.id
EXPLAIN SELECT * FROM cnip WHERE name='erick';
EXPLAIN SELECT * FROM cnip WHERE name ='erick' OR name IS NULL;
EXPLAIN SELECT * FROM cnip WHERE name = 'erick' OR address = 'xian';
EXPLAIN SELECT * FROM cnip WHERE key1 IN ('a','b','c');
EXPLAIN SELECT * FROM cnip WHERE key1 >'a' AND key1<'b';
EXPLAIN SELECT * FROM cnip WHERE key1=1;
system>const>eq_ref>ref>fulltext>ref_or_null>index_merger>unique_subquery
>index_subquery >range>index>all
5. possible_keys/key
- possible_key: 可能使用到的索引
- key:实际使用的索引
6. key_len
- 实际使用到的索引长度(字节数)
- 主要针对联合索引,值越大越好
7. rows
8. filtered
- 某个表经过搜索条件过滤后,剩余记录条数的百分比
- 记录百分比,越高越好
9. extra
三、EXPLAIN的格式化输出
EXPLAIN SELECT * FROM employee;
EXPLAIN FORMAT = JSON SELECT * FROM employee;
EXPLAIN FORMAT = tree SELECT * FROM employee;
MYSQL WORKBENCH: 可视化输出
{
"query_block": {
"select_id": 1,
"cost_info": {
"query_cost": "0.35"
},
"table": {
"table_name": "employee",
"access_type": "ALL",
"rows_examined_per_scan": 1,
"rows_produced_per_join": 1,
"filtered": "100.00",
"cost_info": {
"read_cost": "0.25",
"eval_cost": "0.10",
"prefix_cost": "0.35",
"data_read_per_join": "208"
},
"used_columns": [
"id",
"name"
]
}
}
}