共计 2031 个字符,预计需要花费 6 分钟才能阅读完成。
** 执行打算是 sql 语句的具体执行过程,应用 explain+sql 语句来模仿优化器执行 sql 查问语句。 官网地址
执行打算中蕴含的信息
1.id
select 查问的序列号,蕴含一组数字,示意查问中执行 select 语句的程序,id 号分为三种状况:
1. 如果 id 号雷同,那么执行程序从上到下。
2. 如果 id 不同,id 值越大优先级越高,越先被执行。
3. 同时存在 id 值雷同和不同的,雷同的能够认为是一组,从上往下程序执行,在所有组中,id 值越大,优先级越高,越先执行。
2.select_type
次要用来分辨查问的类型,是一般查问还是联结查问还是子查问。
simple: 简略的查问,不蕴含子查问和 union
primary: 查问中若包任何简单的子查问,最外层查问被标记为 primary
union:若第二个 select 呈现在 union 之后,则被标记为 union
dependent union: 跟 union 相似,此处的 depentent 示意 union 或 union all 联结而成的后果会受内部表影响
subquery: 在 select 或者 where 前面蕴含子查问
dependent subquery:subquery 的子查问受内部表影响
union result: 从 union 表获取后果的 select
derived:rom 子句中呈现的子查问,也叫做衍生表
UNCACHEABLE SUBQUERY:示意应用子查问的后果不能被缓存
uncacheable union: 示意 union 的查问后果不能被缓存
3.table
对应行正在拜访哪一个表,表名或者别名,可能是长期表或者 union 合并后果集。
1、如果是具体的表名,则表明从理论的物理表中获取数据,当然也能够是表的别名
2、表名是 derivedN 的模式,示意应用了 id 为 N 的查问产生的衍生表
3、当有 union result 的时候,表名是 union n1,n2 等的模式,n1,n2 示意参加 union 的 id
4.type
type 显示的是拜访类型,拜访类型示意我是以何种形式去拜访咱们的数据拜访的类型有很多,效率从最好到最坏顺次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
个别状况下,得保障查问至多达到 range 级别,最好能达到 ref。
all: 全表扫描,个别状况下呈现这样的 sql 语句而且数据量比拟大的话那么就须要进行优化。
index:全索引扫描这个比 all 的效率要好,次要有两种状况,一种是以后的查问时笼罩索引,即咱们须要的数据在索引中就能够索取,或者是应用了索引进行排序,这样就防止数据的重排序。
range:示意利用索引查问的时候限度了范畴,在指定范畴内进行查问,这样防止了 index 的全索引扫描,实用的操作符:=, <>, >, >=, <, <=, IS NULL, BETWEEN, LIKE, or IN()。
index_subquery:利用索引来关联子查问,不再扫描全表。
unique_subquery: 该连贯类型相似与 index_subquery, 应用的是惟一索引。
index_merge:在查问过程中须要多个索引组合应用。
ref_or_null:对于某个字段即须要关联条件,也须要 null 值的状况下,查问优化器会抉择这种拜访形式。
ref:应用了非唯一性索引进行数据的查找。
eq_ref:应用唯一性索引进行数据查找。
const:这个表至少有一个匹配行。
system:表只有一行记录(等于零碎表),这是 const 类型的特例,平时不会呈现。
5.ssible_keys
显示可能利用在这张表中的索引,一个或多个,查问波及到的字段上若存在索引,则该索引将被列出,但不肯定被查问理论应用
6.KEY
理论应用的索引,如果为 null,则没有应用索引,查问中若应用了笼罩索引,则该索引和查问的 select 字段重叠。
7.key_len
示意索引中应用的字节数,能够通过 key_len 计算查问中应用的索引长度,在不损失精度的状况下长度越短越好。
8.ref
显示索引的哪一列被应用了,如果可能的话,是一个常数
9.rows
依据表的统计信息及索引应用状况,大抵估算出找出所需记录须要读取的行数,此参数很重要,间接反馈的 sql 找了多少数据,在实现目标的状况下越少越好
10.extra
蕴含额定的信息。
using filesort: 阐明 mysql 无奈利用索引进行排序,只能利用排序算法进行排序,会耗费额定的地位
explain select * from emp order by sal;
using temporary: 建设长期表来保留两头后果,查问实现之后把长期表删除
using index: 这个示意以后的查问时笼罩索引的,间接从索引中读取数据,而不必拜访数据表。如果同时呈现 using where 表名索引被用来执行索引键值的查找,如果没有,外表索引被用来读取数据,而不是真的查找