mysql explain desc_Mysql中的explain和desc

本文深入解析了MySQL查询分析器explain的使用方法及各参数含义,包括id、select_type、table等定位查询的关键属性,以及type连接类型从const到all的不同级别,通过实例展示了如何利用这些信息来优化SQL查询。
摘要由CSDN通过智能技术生成

查询分析器 desc 和 explain 作用基本一样,explain速度快一点

explain 一条SQL语句出出现以下参数, 其中id,select_type,table 用于定位查询,表示本行参数所对应的SQL查询部分

664cfec116a2e06c0ef0395a641db0af.png

- id

SELECT 识别符,这是SELECT的查询序列号,不重要,需要注意的是,不要把id当成执行顺序,这并不准确

- select_type

可以分为以下几种:

1、 SIMPLE: 指示非子查询和union的简单查询。

select * from class

2、PRIMARY:指示在有子查询的语句中最外面的select, 主查询。

select * from class where class_id in (select class_id from student)

3、UNION:指示使用union语句的第二个或者后面的select。

select name from teachers union select name from students

4、DEPENDENT UNION: 子查询union语句的第二个或者后面的select。

5、UNION RESULT: union语句的结果集

select * from class where class_id in (select class_id from teachers union select class_id from students);

6、SUBQUERY: 子查询中的语句, 与union相反理解就行了。

7、DEPENDENT SUBQUERY: 子查询中的第一个语句。

select * from class where class_id in (select class_id from students)

8、DERIVED: 派生表的SELECT(FROM子句的子查询)。

select * from (select class_id,class_name from class)

- table

就是表名,本行记录对应查询所应用的表。可以通过table表名帮助定位查询。

使用explain时,有时table字段显示的并不是表名, 而是derived2 或 derived3等等。。。即derived X 代表的是id为X的查询所得到的结果集。例如:

EXPLAIN

SELECT so.storeorder_id,so.storeorder_sn,si,stores_name

from ec_stores_order so

INNERJOIN(SELECT stores_id, stores_name from ec_stores_info where stores_creatorid=2) si

on so.store_id=si.stores_id

explain该语句就会得到 derived 2 的table

- partitions

- type(重点)

连接类型。查询效率的关键,下面按照从最佳类型到最坏类型进行排序

从最好到最差的连接类型为const、eq_ref、ref、range、index和all。

1、system

存在于手册中(没怎么见过),最好的连接类型,时候const联接类型的一个特例。

2、const

表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次! 即在查询主键索引或是唯一索引时使用。

select * from table where id=1 //主键查询

3、eq_ref

在连接查询时,连接字段使用主键或是唯一索引时被使用,很常见

4、ref

与eq_ref相对,在连接查询时,连接字段使用非主键或是唯一索引的普通索引、单列索引或是组合索引的左前缀时被使用,该连接方式可以在索引列范围查询(< = >)时被使用

ref,使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行。

5、ref_or_null

连接的索引列中有null值,ref就会变成这个

6、index_merge

该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

7、unique_subquery

该类型替换了IN子查询。

unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。只适用于主键或唯一索引。

8、index_subquery

该联接类型类似于unique_subquery。可以替换IN子查询,但只适合非唯一索引。

9、range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。

当使用=、<>、>、>=、、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。

10、index

该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。(会扫描整棵索引树)

11、ALL

没有用到索引,将扫描全表记录,应极力避免。

- possible_keys

可能能用到的索引,没太大卵用~

- key(关键)

用到的索引名,关键。查询效率与索引引用息息相关

- key_len

MySQL使用的索引长度

- ref

如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

引用到的上一个表的列

- rows

显示查询扫描的行数,显然数据越小越好

- filtered

表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。

- Extra

查询的详细信息,包含所有其它操作,列如

Distinct,using,index,using where,Using union等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值