关于mysql:深入理解Mysql性能分析explain

3次阅读

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

正文完
 0