MySQL 使用explain分析sql语句的查询效率(二)

本文将继续上文讲解其他与效率相关的参数
explain所返回的其他参数key为使用的索引,而使用的索引又影响着连接类型type,它们共同决定了可能扫描行数rows

参数解析

(4)type (重点)

联接类型。查询效率的关键,下面按照从最佳类型到最坏类型进行排序

1.system 存在于手册中(没怎么见过),最好的连接类型,是const联接类型的一个特例。

2.const 表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次! 即在查询主键索引或是唯一索引时使用。

select * from table where id=1    //利用主键查询

3.eq_ref 在连接查询时,连接字段使用主键或是唯一索引时被使用,很常见:

EXPLAIN
SELECT o.storeorder_id,o.storeorder_sn,i.stores_name 
FROM `ec_stores_order` o
INNER JOIN ec_stores_info i on i.stores_id=o.store_id

这里写图片描述

可以看到sql通过stores_info表主键stores_id连接查询只扫描一行记录,是相当快速的。

4.ref 与eq_ref相对,在连接查询时,连接字段使用非主键或是唯一索引的普通索引、单列索引或是组合索引的左前缀时被使用,该连接方式可以在索引列范围查询(< = >)时被使用。
将一sql改写为如下等效sql:

EXPLAIN
SELECT o.storeorder_id,o.storeorder_sn,i.stores_name
FROM ec_stores_order o
INNER JOIN (SELECT stores_id,stores_name from ec_stores_info) i on i.stores_id = o.store_id

已知stores_order表中已经建有store_id与order_status的组合索引 名IDX_STORE_ID_ORDER_STATUS,store_id为左前缀。explain返回结果变成了:
这里写图片描述

由于连接的是子查询的结果集,无法使用stores_info表主键索引。故而使用stores_order表中的索引。

5.ref_or_null
连接的索引列中有null值,ref就会变成这个。

6 index_merge
该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。

7 unique_subquery
该类型替换了IN子查询。
unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。只适用于主键或唯一索引。

EXPLAIN
SELECT o.storeorder_id,o.storeorder_sn
FROM ec_stores_order o
where o.store_id in(select stores_id from ec_stores_info where stores_creatorid=3)

这里写图片描述

8 index_subquery
该联接类型类似于unique_subquery。可以替换IN子查询,但只适合非唯一索引。

9 range
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。key_len包含所使用索引的最长关键元素。在该类型中ref列为NULL。
当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。

10 index
该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。(会扫描整棵索引树)。

11 ALL
没有用到索引,将扫描全表记录,应极力避免。

(5)possible_keys

可能能用到的索引,没什么卵用~

(6)key

用到的索引名,关键。查询效率与索引使用息息相关

(7)key_len

MYSQL使用的索引长度

(8)ref

显示回行时所使用的列和参数。(回行:即通过索引检索到记录标识后,返回数据库查找所在行的详细数据。有空的话,我会写一篇索引工作原理在其中详细介绍)

(9)rows

显示查询扫描的行数,显然数值越大越不好。这只是预估值。

(9)Extra

查询的详细信息,包含所有其他操作,例如
Distinct,using index,using where,Using union等等,
顾名思义,在此不详细累述

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值