共计 2279 个字符,预计需要花费 6 分钟才能阅读完成。
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,找到第一行匹配的值马上进行寻找同样的值。