MySQL Explain
程序员文章站
2022-04-19 14:15:43
慢日志数据库开启慢查询记录执行时间比较久的SQL语句mysql> SHOW VARIABLES LIKE "%slow%";+---------------------+-------------------------------------------------------------+| Variable_name | Value ......
慢日志
数据库开启慢查询记录执行时间比较久的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 | 遍历全表找到匹配行 |
本文地址:https://blog.csdn.net/JunChow520/article/details/107152473
上一篇: mysql高级部分学习
下一篇: MySQL必知必会知识点备份