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,找到第一行匹配的值马上进行寻找同样的值。