mysql const ref_mysql explain详解

不得不了解一些explain的用法。

首先看看输出地参数:86dce6b4a611981819b0d40e9751a23a.png

这些参数中,我们常常需要关心的是这几个参数

1,select_type,就是select类型.主要有这几种,

SIMPLE:这个是简单的sql查询,不使用UNION或者子查询

PRIMARY:子查询中最外层的select

UNION:UNION中的第二个或后面的SELECT语句

DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT:UNION的结果。

SUBQUERY:子查询中的第一个SELECT.

DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询

DERIVED:派生表的SELECT(FROM子句的子查询)

2,table 输出行所引用的表

3,type 结类型。各种类型的信息在下面给出。

system

表仅有一行(=系统表)。这是const联结类型的一个特例。

const

表有最多一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被剩下的优化器认为是常数。

const表很快,因为它们只读取一次!

eq_ref

对于每个来自于先前的表的行组合,从该表中读取一行。这可能是最好的联结类型,除了const类型。它用在一个索引的所有部分被联结使用并且索引是UNIQUE或PRIMARY

KEY。

ref

对于每个来自于先前的表的行组合,所有有匹配索引值的行将从这张表中读取。

如果联结只使用键的最左面前缀,不或如果键不是UNIQUE或PRIMARY

KEY(换句话说,如果联结能基于键值选择单个行的话),使用ref。如果被使用的键仅仅匹配一些行,该联结类型是不错的。

range

只有在一个给定范围的行将被检索,使用一个索引选择行。ref列显示哪个索引被使用。

index

这与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

ALL

对于每个来自于先前的表的行组合,将要做一个完整的表扫描。

如果表格是第一个没标记const的表,这通常不好,并且通常在所有的其他情况下很差。你通常可以通过增加更多的索引来避免ALL,使得行能从早先的表中基于常数值或列值被检索出。

从上面可以发现,从上至下依次是越来越坏的结果,当然最好的还是Null,没有查询本表。

4,possible_keys:possible_keys列指出MySQL能使用哪个索引在该表中找到行5,key:key列显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。6,key_len key_len列显示MySQL决定使用的键长度。如果键是NULL,长度是NULL。注意这告诉我们MySQL将实际使用一个多部键值的几个部分。7 ref:ref列显示哪个列或常数与key一起用于从表中选择行。8,rows rows列显示MySQL相信它必须检验以执行查询的行数。9,Extra如果是Only index,这意味着信息只用索引树中的信息检索出的。通常,这比扫描整个表要快。

如果是where used,它意味着一个WHERE子句将被用来限制哪些行与下一个表匹配或发向客户。

如果是impossible where 表示用不着where

如果是Using filesort表示用到了文件排序,通常在数据量大的情况下,要减少这种查询

-------------------------------------------------------------------------------------------

type

联合查询所使用的类型。

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:

system > const > eq_ref

> ref > fulltext >

ref_or_null > index_merge >

unique_subquery > index_subquery >

range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys

指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

key

显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。

key_len

显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

ref

显示哪个字段或常数与key一起被使用。

rows

这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

Extra

如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。

如果是where used,就是使用上了where限制。

如果是impossible where 表示用不着where,一般就是没查出来啥。

如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER

BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using

filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值