MySQL Explain

慢日志

数据库开启慢查询记录执行时间比较久的SQL语句

mysql> SHOW VARIABLES LIKE "%slow%";
+---------------------+-------------------------------------------------------------+
| Variable_name       | Value                                                       |
+---------------------+-------------------------------------------------------------+
| log_slow_queries    | OFF                                                         |
| slow_launch_time    | 2                                                           |
| slow_query_log      | OFF                                                         |
| slow_query_log_file | D:\phpStudy\PHPTutorial\MySQL\data\DESKTOP-H6DQQNO-slow.log |
+---------------------+-------------------------------------------------------------+
参数 描述
slow_query_log 是否开启慢日志查询,默认为OFF。
slow_query_log_file 慢日志文件配置路径
log_slow_queries 已被slow_query_log取代,兼容性保留。

临时开启慢日志

mysql> SET GLOBAL slow_query_log="ON";

慢日志默认记录的是查询超过10秒的SQL语句

mysql> SHOW VARIABLES LIKE "long_query_time";
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set

优化器

EXPLAIN命令用于查询SQL语句的执行计划,可查看到SQL语句是否使用索引、是否做全表扫描。

EXPLAIN关键字用于模拟MySQL优化器执行SQL语句,用于分析SQL语句和表性能瓶颈。

EXPLAIN关键字可获取信息包括

  • 表读取顺序
  • 数据读取操作
  • 可使用的索引
  • 实际已使用的缩影
  • 表之间的引用
  • 表有多少行被优化器查询
EXPLAIN SQL语句

例如:

mysql > EXPLAIN SELECT * FROM test.accounts WHERE 1=1;
+----+-------------+----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | accounts | ALL  | NULL          | NULL | NULL    | NULL |    2 |       |
+----+-------------+----------+------+---------------+------+---------+------+------+-------+
1 row in set
字段 描述
id 查询序列号,表示查询中执行SELECT子句或操作表的顺序,即表的读取顺序。
table 正在访问的数据表
select_type 查询类型,数据读取操作的操作类型。
tpye 访问类型
possible_keys 可能应用在当前表中的索引,那些索引可以使用。
key 实际使用的索引,哪些索引被实际使用。
ken_len 索引使用的字节数即索引长度
ref 索引列,表直接的引用。
rows 根据表统计信息以及索引选用情况,估算出查询记录所需扫描读取的行数。每张表会有多少行被优化器查询。
Extra 额外信息

查询序列号id

SELECT查询的序列号,包括一组数字,表示查询中执行SELECT子句或操作表的顺序,id字段通常于table字段搭配来分析。

  • 多个ID相同,则表示读取顺序从上到下,依次执行。
  • 多个ID不同,如是子查询则ID序号递增,ID越大优先级越高,越先被执行。
  • 多个ID有相同也有不同,ID相同可认为是一组从上到下顺序执行,组中ID不同则ID越大优先级越高优先执行。

查询类型select_type

查询类型 描述
SIMPLE 简单查询,不包含子查询或联合查询。
PRIMAY 主查询,查询中若包含复杂的子部分,最外层查询则会被标记为PRIMARY。
SUBQUERY 子查询,即在SELECT或WHERE子句中包含子查询。
DERIVED 衍生查询,在FROM子句中包含了子查询。
UNION 联合查询
UNION RESULT 从联合表获取结果中进行的查询

访问类型type

type表示查询所使用的访问而类型,用于表示查询的SQL的好坏程序,从最好到最差依次为:system > const > eq_ref > ref > range > index > all

访问类型 描述
NULL MySQL在优化阶段分解查询语句,在执行阶段不再访问表或索引。
system 表只有一条记录,等同于系统表。
const 通过索引一次即可找到,const用于primary key或unique索引,因为只匹配一行所以很快。
eq_ref 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描。
ref 非唯一性索引扫描,返回匹配某个单独值得所有行,本质上是一种索引访问,返回所有匹配某个单独值得行。
ref_or_null 类似ref但可搜索值为NULL得行
index_merge 使用索引合并得优化方法
range 只索引给定范围得行,使用一个索引来选择行,key列显示使用哪个索引。
index 从索引中读取
all 遍历全表找到匹配行

你可能感兴趣的:(MySQL Explain)