1.explain是什么

2.explain能做什么

3.explain具体应用

1.explain是什么
mysql的explain(查看执行打算)能够模仿数据库执行引擎执行sql语句,从而晓得mysql是如何解决你的sql语句的,进而剖析这个查问语句的瓶颈

此外,mysql有本人的专门负责优化select语句的优化器模块,它会剖析你这个select语句,提供它认为最优的执行打算,比方去掉一些无用而不言而喻的条件(1=1),结构调整(依据索引的程序调整where前面的程序)。

2.explain能做什么
explain能够列出一个查问的执行打算,显示出以下这些信息
1)表的读取程序
2)数据读取的时候的操作类型
3)哪些索引可能被应用
4)**哪些索引理论被应用
5)被应用的索引长度
6)表之间的援用
7)如果有分区,是哪个分区被应用
7)每张表有多少行被优化器查问
8)这些被查问的行,最终被查问出的无效数据命中率是多少
9)一些额定的排序等信息

3.explain具体应用

3.1如何应用explain

explain 你的查问语句

比方 explain select * from t_customer

执行结束后会查出很多信息:

咱们来挨个解释一下

3.2 id
id示意select查问的序号,蕴含一组数字,示意查问中执行的select语句中操作表的程序

它会有两种状况:
当id雷同的时候,执行程序由上到下

咱们从图中能够看出,这个查问是先执行了t1,再执行t2的查问。

当id不同的时候,id值越大的越先被执行
咱们能够看出,这个查问先查问的是t2,而后再查问t1

3.3 select_type
select_type会有以下的值:

SIMPLE:简略的select查问,查问中不蕴含子查问或者union

PRIMARY:若查问中蕴含任何简单的子局部,最外层的查问则被标记为PRIMARY

SUBQUERY:在select或者where列表中蕴含了子查问

DEREVED:在from列表中蕴含的子查问被标记为DEREVED(衍生),mysql会递归执行这些子查问,把后果放到长期表外面。

UNION:若第二个select呈现在union之后,则被标记为union,如果union蕴含在from子句的子查问中,外层select将标记为DEREVED。

UNION RESULT:从union中取后果的select

3.4 table
table显示这一行的数据是对于哪张表的。

3.5 partitions
如果查问时基于分区表的查问,会显示查问将拜访的分区。

3.6 type

type极为重要,是较为重要的一个指标,后果值从最好到最坏顺次为:
system>const>eq_ref>ref>fulltext>ref_or_null>unique_subquery>index_subquery>range>index>All

这么写可能太多,咱们能够列举几个罕用的:
system>const>eq_ref>ref_range>index>all

system:表只有一行记录,间接查问就查到了,这种状况十分稀少。

const:数据示通过索引顺次就能够查到,罕用于主键或者惟一索引,只用匹配一行数据,如果主键置于where列表中,mysql就能将该查问转换为一个const。

eq_ref:惟一索引扫描,对于每个索引的key,表中只有一行记录能够和一个key匹配,这是除了下面那两种类型以外最好的类型了。

ref:应用到了索引,然而索引不是惟一索引,这个索引key可能会和多条数据匹配,会找到多条合乎数据的行。

range范畴扫描,通常呈现在 <,>,between,in之类的语句中,用索引来检索一个给定的范畴

index:index类型为遍历所有的索引,找到匹配的数据。

ALL扫描数据库所有的行,找到匹配的数据。

index和all相比,一个是扫描所有的索引一个是原表扫描所有的数据,所以index会比all快很多

3.7 possible_key

可能会用到的索引,然而不肯定在理论查问中被应用。

3.8 key

理论用到的索引,如果为null就是没用到索引。

3.9 key_len
示意索引中应用的字节数,指要查问到这条数据应用的索引长度,长度越短越好。

3.10 ref
显示索引哪一列被应用了

3.11 rows
要查出这条数据,大略须要扫描多少行,越少越好。

3.12 filtered
示意通过rows筛选出的数据后,符合条件的比例,留神是百分比,不是记录总数。

如:
扫描一行就能够得出数据,命中率是百分之一百

3.13 extra
蕴含不适宜在其它列中显示,然而却非常重要的信息:

Using filesort(坏):阐明mysql无奈应用索引排序,会对数据应用一个内部的索引排序,而不是依照表内的索引程序进行读取。

Using temporary (坏):应用了长期表的两头后果,mysql在对查问后果进行排序的时候应用了长期表,常见于order by 或者group by .

USING index (好): 示意select操作中应用了笼罩索引,防止了原表拜访。

Using where (好):应用了where过滤

using join buffer (好) :应用了链接缓存

impossible where(坏) :where子句的总值是false,不能拿来应用

select tables optimized away (好):在没有group by子句的状况下,基于索引优化max/min的操作,不用等到执行阶段再计算。

8.distinct(好): 优化distinct,找到第一行匹配的值马上进行寻找同样的值。