Mysql怎么查看执行计划

49次阅读
没有评论

共计 3220 个字符,预计需要花费 9 分钟才能阅读完成。

这篇文章主要介绍“Mysql 怎么查看执行计划”,在日常操作中,相信很多人在 Mysql 怎么查看执行计划问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql 怎么查看执行计划”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

使用 explain 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的,分析你的查询语句或是表结构的性能瓶颈。

explain 执行计划包含的信息

其中最重要的字段为:id、type、key、rows、Extra

各字段详解 id

select 查询的序列号,包含一组数字,表示查询中执行 select 子句或操作表的顺序

三种情况:

1、id 相同:执行顺序由上至下

2、id 不同:如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行

3、id 相同又不同(两种情况同时存在):id 如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id 值越大,优先级越高,越先执行

select_type

查询的类型,主要是用于区分普通查询、联合查询、子查询等复杂的查询

1、SIMPLE:简单的 select 查询,查询中不包含子查询或者 union

2、PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为 primary

3、SUBQUERY:在 select 或 where 列表中包含了子查询

4、DERIVED:在 from 列表中包含的子查询被标记为 derived(衍生),mysql 或递归执行这些子查询,把结果放在零时表里

5、UNION:若第二个 select 出现在 union 之后,则被标记为 union;若 union 包含在 from 子句的子查询中,外层 select 将被标记为 derived

6、UNION RESULT:从 union 表获取结果的 select

type

访问类型,sql 查询优化中一个很重要的指标,结果值从好到坏依次是:

system   const   eq_ref   ref   fulltext   ref_or_null   index_merge   unique_subquery   index_subquery   range   index   ALL

一般来说,好的 sql 查询至少达到 range 级别,最好能达到 ref

1、system:表只有一行记录(等于系统表),这是 const 类型的特例,平时不会出现,可以忽略不计

2、const:表示通过索引一次就找到了,const 用于比较 primary key 或者 unique 索引。因为只需匹配一行数据,所有很快。如果将主键置于 where 列表中,mysql 就能将该查询转换为一个 const

3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键 或 唯一索引扫描。

注意:ALL 全表扫描的表记录最少的表如 t1 表

4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质是也是一种索引访问,它返回所有匹配某个单独值的行,然而他可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体

5、range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了那个索引。一般就是在 where 语句中出现了 bettween、、、in 等的查询。这种索引列上的范围扫描比全索引扫描要好。只需要开始于某个点,结束于另一个点,不用扫描全部索引

6、index:Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树。这通常为 ALL 块,应为索引文件通常比数据文件小。(Index 与 ALL 虽然都是读全表,但 index 是从索引中读取,而 ALL 是从硬盘读取)

7、ALL:Full Table Scan,遍历全表以找到匹配的行

Mysql 怎么查看执行计划

possible_keys

查询涉及到的字段上存在索引,则该索引将被列出,但不一定被查询实际使用

key

实际使用的索引,如果为 NULL,则没有使用索引。

查询中如果使用了覆盖索引,则该索引仅出现在 key 列表中

Mysql 怎么查看执行计划

Mysql 怎么查看执行计划

key_len

表示索引中使用的字节数,查询中使用的索引的长度(最大可能长度),并非实际使用长度,理论上长度越短越好。key_len 是根据表定义计算而得的,不是通过表内检索出的

ref

显示索引的那一列被使用了,如果可能,是一个常量 const。

rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

Extra

不适合在其他字段中显示,但是十分重要的额外信息

1、Using filesort:

mysql 对数据使用一个外部的索引排序,而不是按照表内的索引进行排序读取。也就是说 mysql 无法利用索引完成的排序操作成为“文件排序”

Mysql 怎么查看执行计划

由于索引是先按 email 排序、再按 address 排序,所以查询时如果直接按 address 排序,索引就不能满足要求了,mysql 内部必须再实现一次“文件排序”

2、Using temporary:

使用临时表保存中间结果,也就是说 mysql 在对查询结果排序时使用了临时表,常见于 order by 和 group by

Mysql 怎么查看执行计划

3、Using index:

表示相应的 select 操作中使用了覆盖索引(Covering Index),避免了访问表的数据行,效率高

如果同时出现 Using where,表明索引被用来执行索引键值的查找(参考上图)

如果没用同时出现 Using where,表明索引用来读取数据而非执行查找动作

Mysql 怎么查看执行计划

覆盖索引(Covering Index):也叫索引覆盖。就是 select 列表中的字段,只用从索引中就能获取,不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖。

注意:

a、如需使用覆盖索引,select 列表中的字段只取出需要的列,不要使用 select *

b、如果将所有字段都建索引会导致索引文件过大,反而降低 crud 性能

4、Using where:

使用了 where 过滤

5、Using join buffer:

使用了链接缓存

6、Impossible WHERE:

where 子句的值总是 false,不能用来获取任何元祖

Mysql 怎么查看执行计划

7、select tables optimized away:

在没有 group by 子句的情况下,基于索引优化 MIN/MAX 操作或者对于 MyISAM 存储引擎优化 COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即可完成优化

8、distinct:

优化 distinct 操作,在找到第一个匹配的元祖后即停止找同样值得动作

综合 Case

Mysql 怎么查看执行计划

执行顺序

1(id = 4)、【select id, name from t2】:select_type 为 union,说明 id= 4 的 select 是 union 里面的第二个 select。

2(id = 3)、【select id, name from t1 where address =‘11’】:因为是在 from 语句中包含的子查询所以被标记为 DERIVED(衍生),where address =‘11’通过复合索引 idx_name_email_address 就能检索到,所以 type 为 index。

3(id = 2)、【select id from t3】:因为是在 select 中包含的子查询所以被标记为 SUBQUERY。

4(id = 1)、【select d1.name, … d2 from … d1】:select_type 为 PRIMARY 表示该查询为最外层查询,table 列被标记为“derived3”表示查询结果来自于一个衍生表(id = 3 的 select 结果)。

5(id = NULL)、【… union …】:代表从 union 的临时表中读取行的阶段,table 列的“union 1, 4”表示用 id=1 和 id=4 的 select 结果进行 union 操作。

到此,关于“Mysql 怎么查看执行计划”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计3220字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)