文档章节

mysql之explain详解(分析索引的最佳使用)

 空灵飞渡
发布于 2017/05/19 16:48
字数 747
阅读 14
收藏 0

在这里对explain的各个字段进行详细的分析,来帮助大家分析自己所写的sql是否最佳的使用了索引。

 

首先是select_type:将select查询分为简单(simple)和复杂两种类型

复杂类型又分为子查询(subquery)和from列表中包含子查询(drived)

simple:

drived:

就type进行详细的介绍:

System,const,eq_ref,ref,range,index,all

all : 即全表扫描

index : 按索引次序扫描,先读索引,再读实际的行,结果还是全表扫描,主要优点是避免了排序。因为索引是排好的。

range:以范围的形式扫描。

explain select * from a where a_id > 1\G

ref:非唯一索引访问(只有普通索引)

create table a(a_id int not null, key(a_id));

insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

mysql> explain select * from a where a_id=1\G

eq_ref:使用唯一索引查找(主键或唯一索引)

const:常量查询

在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

当结果不是一条时,就会变成index或range等其他类型

system:系统查询

null:优化过程中就已经得到结果,不在访问表或索引

possible_keys:可能用到的索引

key:实际用到的索引

key_line:索引字段最大可能使用长度

ref:

指出对 key 列所选择的索引的查找方式,常见的值有 const, func, NULL, 具体字段名。当 key 列为 NULL ,即不使用索引时,此值也相应的为 NULL 。

rows:估计需要扫描的行数

Extra:显示以上信息之外的其他信息

Using index

此查询使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表。

若没显示"Using index"表示读取了表数据。

Using where

表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。

Using temporary

使用到临时表

建表及插入数据:

create table a(a_id int, b_id int);

insert into a values(1,1),(1,1),(2,1),(2,2),(3,1);

mysql> explain select distinct a_id from a\G
        Extra: Using temporary

MySQL 使用临时表来实现 distinct 操作。

 

Using filesort

若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。

select * from a order by id;

对于没有索引的列进行order by 就会出现filesort

本文转载自:http://blog.csdn.net/b1303110335/article/details/51174540

粉丝 6
博文 187
码字总数 87809
作品 0
广州
私信 提问
mysql explain 详解

对于经常使用mysql的兄弟们,对explain一定不会陌生。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处理SELECT,提供有关表如何联合和以什么次序的信息。借助于EXPLAIN,你可...

vga
2016/08/25
82
0
mysql的sql执行计划详解

实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表、怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是...

重庆_杨静
2018/04/08
56
0
面试前必须知道的MySQL命令【explain】

只有光头才能变强 刷面试题的时候,不知道你们有没有见过MySQL这两个命令:和(反正我就见过了).. 之前虽然知道这两个命令大概什么意思,但一直没有去做笔记。今天发现自己的有这么两个命令,...

Java3y
2018/12/06
37
0
mysql的sql执行计划详解(非常有用)

引言: 实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表、怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时...

xiaomin0322
2018/04/08
58
0
MYSQL explain详解

http://blog.csdn.net/zhuxineli/article/details/14455029 explain显示了MySQL如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 先解析一条sql语句...

chencheng192
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部