mysql explain性能解析

mysql explain性能解析

explain执行计划结果

+----+-------------+-------------------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table                   | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------------------+------+---------------+------+---------+------+------+-------+
  1. id
    id是用来顺序标识整个查询中SELELCT 语句的,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行。该值可能为NULL。
  2. select_type
simple简单子查询,不包含子查询和union
primary包含union或者子查询,最外层的部分标记为primary
subquery一般子查询中的子查询被标记为subquery,也就是位于select列表中的查询
derived派生表——该临时表是从子查询派生出来的,位于form中的子查询
union位于union中第二个及其以后的子查询被标记为union,第一个就被标记为primary如果是union位于from中则标记为derived
union result用来从匿名临时表里检索结果的select被标记为union result
dependent union首先需要满足UNION的条件,及UNION中第二个以及后面的SELECT语句,同时该语句依赖外部的查询
subquery子查询中第一个SELECT语句
dependent subquery和DEPENDENT UNION相对UNION一样
  1. table
    输出行所引用的表
  2. type
    表示按某种类型来查询,例如按照索引类型查找,按照范围查找。
    常用的类型有: ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)
ALLFull Table Scan, MySQL将遍历全表以找到匹配的行
indexFull Index Scan,index与ALL区别为index类型只遍历索引树
range只检索给定范围的行,使用一个索引来选择行
ref表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列
eq_ref类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件
const、system当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,system是const类型的特例,当查询的表只有一行的情况下,使用system
NULLMySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
  1. possible_keys
    可能用到的索引,保存的是索引名称,如果是多个索引的话,用逗号隔开。如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高查询性能。
  2. key
    实际用到的索引,保存的是索引名称,如果是多个索引的话,用逗号隔开,这一列显示mysql实际采用哪个索引来优化对该表的访问,
    如果没有使用索引,则该列是 NULL。
  3. key_len
    表示本次查询中,所选择的索引长度有多少字节,不损失精确性的情况下,长度越短越好,索引最大长度是768字节,当字符串过长时,mysql会做一个类似左前缀索引的处理,将前半部分的字符提取出来做索引。 这一列显示了mysql在索引里使用的字节数,通过这个值可以算出具体使用了索引中的哪些列。
  4. ref
    显示索引的哪一列被使用了,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  5. rows
    显示mysql认为执行查询时必须要返回的行数,这一列是mysql估计要读取并检测的行数,注意这个不是结果集里的行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。
  6. Extra
    额外的信息,例如:using file sort ,using where, using join buffer,using index等。
distinctmysql找到了与行相联合匹配的行之后,就不再搜索了
Using index这发生在对表的请求列都是同一索引的部分的时候,返回的列数据只使用了索引中的信息,而没有再去访问表中的行记录。是性能高的表现。
Using wheremysql服务器将在存储引擎检索行后再进行过滤。就是先读取整行数据,再按 where 条件进行检查,符合就留下,不符合就丢弃。
Using temporarymysql需要创建一张临时表来处理查询。出现这种情况一般是要进行优化的,首先是想到用索引来优化。
Using filesortmysql 会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。此时mysql会根据联接类型浏览所有符合条件的记录,并保存排序关键字和行指针,然后排序关键字并按顺序检索行信息。这种情况下一般也是要考虑使用索引来优化的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值