mysql的执行计划-explain
mysql使用 explain来查看执行计划:根据MySQL执行计划的输出,分析索引使用情况、扫描的行数可以预估查询效率;进而可以重构SQL语句、调整索引,提升查询效率。
https://www.cnblogs.com/sunjingwu/p/10755823.html
一.id ,select 查询***
1 id相同,从上往下一次执行;2 id不同,id越大优先级越高,越先被执行。
二.select_type,查询语句类型
(1)SIMPLE(简单SELECT的查询,不使用UNION或子查询等)
(2) PRIMARY(查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果)
(6) SUBQUERY(子查询中的第一个SELECT)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,取决于外面的查询)
(8)DERIVED(派生/衍生表的SELECT, FROM子句的子查询)
(9) MATERIALIZED(物化子查询) 在SQL执行过程中,第一次需要子查询结果时执行子查询并将子查询的结果保存为临时表 ,后续对子查询结果集的访问将直接通过临时表获得。
(10) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)
(11) UNCACHEABLE UNION(UNION查询的结果不能被缓存)
三、table,查询涉及的表或衍生表
四、partitions查询涉及到的分区
五、type 提供了判断查询是否高效的重要依据依据
通过 type
字段, 我们判断此次查询是全表扫描还是索引扫描等
(1)system
: 表中只有一条数据,相当于系统表; 这个类型是特殊的 const
类型;
(2)const
: 主键或者唯一索引的常量查询,表格最多只有1行记录符合查询,通常const使用到主键或者唯一索引进行定值查询。
(3)eq_ref
: 除了system和const类型之外,效率最高的连接类型;唯一索引扫描,对于每个索引键,表中只有一条记录与之对应;常用于主键或唯一索引扫描
equ_ref用于唯一索引查询,对每个索引键,表中只有一条或零条记录与之匹配。
(4)ref:此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了最左前缀
规则索引的查询
(5)range
: 表示使用索引范围查询, 通过索引字段范围获取表中部分数据记录. 这个类型通常出现在 =, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, IN() 操作中。
(6)index
: 扫描索引树
如果索引是复合索引,并且复合索引列满足select所需的所有数据,则仅扫描索引树。在这种情况下,Extra
为 Using index
。仅索引扫描通常比ALL索引的大小通常小于表数据更快 。
索引列不满足select所需的所有数据,此时需要回表扫描;按索引顺序查找数据行。 Uses index
没有出现在 Extra
列中。
(7)ALL
: 全表扫描,没有任何索引可以使用时。这是最差的情况,应该避免。
六、possible_keys:指示MySQL可能使用到的索引。
七、key:MySQL查询实际使用到的索引。
八、key_len:表示索引中使用的字节数(只计算利用索引作为index key的索引长度,不包括用于group by/order by的索引长度)
- 一般地,key_len 等于索引列类型字节长度,例如int类型为4 bytes,bigint为8 bytes;
- 如果是字符串类型,还需要同时考虑字符集因素,例如utf8字符集1个字符占3个字节,gbk字符集1个字符占2个字节
- 若该列类型定义时允许NULL,其key_len还需要再加 1 bytes
- 若该列类型为变长类型,例如 VARCHAR(TEXT\BLOB不允许整列创建索引,如果创建部分索引也被视为动态列类型),其key_len还需要再加 2 bytes
字符集会影响索引长度、数据的存储空间,为列选择合适的字符集;变长字段需要额外的2个字节,固定长度字段不需要额外的字节。而null都需要1个字节的额外空间,所以以前有个说法:索引字段最好不要为NULL,因为NULL让统计更加复杂,并且需要额外一个字节的存储空间。
九、ref:显示该表的索引字段关联了哪张表的哪个字段
十、rows:根据表统计信息及选用情况,大致估算出找到所需的记录或所需读取的行数,数值越小越好
十一、filtered:返回结果的行数占读取行数的百分比,值越大越好