mysql explain字段含义_史上最全的explain常见结果含义分析,值得收藏

概述

对于MySQL执行计划的获取,我们可以通过explain方式来查看,explain方式看似简单,实际上包含的内容很多,尤其是输出结果中的type类型列。理解这些不同的类型,对于我们SQL优化举足轻重。今天主要介绍一下常见的type结果及代表的含义,并且通过同一个SQL语句的性能差异,说明建对索引多么重要。

explain结果中的type字段代表什么意思?

MySQL的官网解释非常简洁,只用了3个单词:连接类型(the join type)。它描述了找到所需数据使用的扫描方式。

一、EXPLAIN 语句中type列的值

效率总结

1)依次从好到差:

system,const,index , range,index_merge,ALL 单独查询

eq_ref,ref,ref_or_null all 多表join 查询

index_subquery unique_subquery 子查询

2)index_merge之外,其他的type只可以用到一个索引

二、system

这里我在多个mysql测试过,如果是5.7以上版本的话就不是system了,而是all,即使只有一条记录。

举一个例子,内层嵌套(const)返回了一个临时表,外层嵌套从临时表查询,其扫描类型是system,也不需要走磁盘IO,速度超快。

三、const

const扫描的条件为:

(1)命中主键(primary key)或者唯一(unique)索引;

(2)被连接的部分是一个常量(const)值;

1、数据准备:

create table t2 (id int primary key,name varchar(20)) engine=innodb;

insert into t2 values(1,'hwb');

insert into t2 values(2,'zhangsan');

insert into t2 values(3,'xiaoming');

commit;

2、查看执行计划

explain select * from t2 where id=1;

如上例,id是PK,连接部分是常量1。

这类扫描效率极高,返回数据量少,速度非常快。

四、eq_ref

eq_ref扫描的条件为,对于前表的每一行(row),后表只有一行被扫描。

再细化一点:

(1)join查询;

(2)命中主键(primary key)或者非空唯一(unique not null)索引;

(3)等值连接;

1、数据准备:

create table t3 (id int primary key,name varchar(20))engine=innodb;

insert into t3 values(1,'hwb');

insert into t3 values(2,'zhangsan');

insert into t3 values(3,'xiaoming');

create table t4 (id int primary key,age int)engine=innodb;

insert into t4 values(1,18);

insert into t4 values(2,20);

insert into t4 values(3,30);

insert into t4 values(4,40);

insert into t4 values(5,50);

commit;

2、查看执行计划

explain select * from t3,t4 where t3.id=t4.id;

如上例,id是主键,该join查询为eq_ref扫描。

这类扫描的速度也异常之快。

五、ref

1、数据准备

create table t5 (id int ,name varchar(20),index(id))engine=innodb;

insert into t5 values(1,'hwb');

insert into t5 values(2,'zhangsan');

insert into t5 values(3,'xiaoming');

create table t6 (id int,age int,index(id))engine=innodb;

insert into t6 values(1,18);

insert into t6 values(2,20);

insert into t6 values(3,30);

insert into t6 values(4,40);

insert into t6 values(5,50);

commit;

如果把上例eq_ref案例中的主键索引,改为普通非唯一(non unique)索引。

就由eq_ref降级为了ref,此时对于前表的每一行(row),后表可能有多于一行的数据被扫描。

explain select * from t5,t6 where t5.id=t6.id;

当id改为普通非唯一索引后,常量的连接查询,也由const降级为了ref,因为也可能有多于一行的数据被扫描。

ref扫描,可能出现在join里,也可能出现在单表普通索引里,每一次匹配可能有多行数据返回,虽然它比eq_ref要慢,但它仍然是一个很快的join类型。

六、range

range扫描就比较好理解了,它是索引上的范围查询,它会在索引上扫码特定范围内的值。

1、数据准备:

create table t7 (id int primary key,name varchar(20))engine=innodb;

insert into user values(1,'hwb');

insert into user values(2,'zhangsan');

insert into user values(3,'xiaoming');

insert into user values(4,'xiaohong');

insert into user values(5,'xiaoqiu');

commit;

2、查看执行计划

explain select * from t7 where id between 1 and 4;

explain select * from t7 where id in(1,2,3);

explain select * from t7 where id>3;

像上面中的between,in,>都是典型的范围(range)查询。

注意:必须是索引,否则不能批量"跳过"。

七、index

index类型,需要扫描索引上的全部数据。

explain select count(*) from t7;

如上例,id是主键,该count查询需要通过扫描索引上的全部数据来计数。

注意:此表为InnoDB引擎,它仅比全表扫描快一点。

八、ALL

1、数据准备:

create table t8 (id int ,name varchar(20))engine=innodb;

insert into t8 values(1,'hwb');

insert into t8 values(2,'zhangsan');

insert into t8 values(3,'xiaoming');

create table t9 (id int,age int)engine=innodb;

insert into t9 values(1,18);

insert into t9 values(2,20);

insert into t9 values(3,30);

insert into t9 values(4,40);

insert into t9 values(5,50);

commit;

2、查看执行计划

explain select * from t8,t9 where t8.id=t9.id;

如果id上不建索引,对于前表的每一行(row),后表都要被全表扫描。

今天介绍的实验中,这个相同的join语句出现了三次:

(1)扫描类型为eq_ref,此时id为主键;

(2)扫描类型为ref,此时id为非唯一普通索引;

(3)扫描类型为ALL,全表扫描,此时id上无索引;

有此可见,建立正确的索引,对数据库性能的提升是多么重要。另外,不正确的SQL语句,可能导致全表扫描。

总结

1、explain结果中的type字段,表示(广义)连接类型,它描述了找到所需数据使用的扫描方式;

2、常见的扫描类型有:

system>const>eq_ref>ref>range>index>ALL

其扫描速度由快到慢;

3、各类扫描类型的要点是:

system最快:不进行磁盘IO

const:PK或者unique上的等值查询

eq_ref:PK或者unique上的join查询,等值匹配,对于前表的每一行(row),后表只有一行命中

ref:非唯一索引,等值匹配,可能有多行命中

range:索引上的范围扫描,例如:between/in/>

index:索引上的全集扫描,例如:InnoDB的count

ALL最慢:全表扫描(full table scan)

4、建立正确的索引(index),非常重要;

5、使用explain了解并优化执行计划,非常重要;

转发到朋友圈是最高的赞赏

因为不是天生丽质,所以必须天生励志!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql schema命名规范_数据库设计 命名及编码规范

http://blog.csdn.net/seusoftware/archive/2010/04/24/5524414.aspx引用一、综述命名和编码过程中,定义有意义的名称,以易于理解、方便书写为原则。(1)避免使用中文,尽量使用全拼音或全英文,以方便国际化;(2)避免拼音…

mysql 大表 备份_MySQL大表备份的简单方法

MySQL大表备份是一个我们常见的问题,下面就为您介绍一个MySQL大表备份的简单方法,希望对您学习MySQL大表备份方面能有所帮助。这里所说的大表是超过4G以上的表,我目前见到过最大为60多G的单表,对于这种表每…

mysql多数据源切换_CI 多数据库操作 切换数据库

CI 切换数据库是很方便的,如:连接多数据库如果你需要同时连接多于一个的数据库,你可以用以下方式来实现:$DB1 $this->load->database(group_one, TRUE);$DB2 $this->load->database(group_two, TRUE);注意&#xff…

mysql用的cap中哪两个_分布式事务CAP定理和BASE理论

课程总计41课时,从什么是事务讲起,直到分布式事务解决方案,很的0基础基础与提升系列课程。对于难以理解的知识点,全部用画图实战的方式讲解。彻底明白事务的四个特性:原子性、一致性、隔离性、持久性,用场景…

怎么检测mysql主从正常_使用pt-table-checksum检查主从复制是否正常

其实对于一个小小的DBA来说,有时候是无法避免这些问题的。于是我们就需要一个工具,来检查主从复制是否正常,是否出现了错误。pt-table-checksum。相关阅读:MySQL 主从复制事件校验 MySQL Replic…

java 自动类型_java类型自动转换

package com.kevin.basic;/** java类型自动转换方面的知识点* int类型 double类型 默认类型*/public class Test {/*** param args*/public static void main(String[] args) {// TODO Auto-generated method stub/* int类型是整数的默认类型。* (1)第一种:正确运行…

java 不显示控制台_命令行启动java程序不显示控制台窗口

关键:start javaw –jar xxx.jar一个例子:ECHO OFFREM "zcx eclipse help script"set ehome"f:\eclipse"pushd %ehome%if "%1" "start" (explorer http://localhost/help/index.jsp)start javaw -classpath pl…

java 修改ini文件_Java读取和修改ini配置文件

/*** 修改ini配置文档中变量的值* param file 配置文档的路径* param section 要修改的变量所在段名称* param variable 要修改的变量名称* param value 变量的新值* throws IOException 抛出文档操作可能出现的io异常*/public static boolean setProfileString(String file,St…

java定义接口规范_关于java的接口的一些规范

一、Api请求及响应规范 为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。1、get 请求时,采用key/value格式请求,SpringMVC可采用基本类型的变量接收,也可以采用对象接收。2、Post请求时,可…

a java虚拟机_Java虚拟机

内存分配以及回收Java虚拟机运行时数据区,分为以下几个模块,包含所有线程共有的数据区和线程单独享有的数据区。程序计数器:字节码行号,通过这个计数器来选取下一条需要执行的指令,线程独有。虚拟机栈:线程…

java tostring的用处_JAVA的tostring()方法的作用是什么呢?

展开全部1.toString方法Object类具有一个toString()方法,你创建的每个类都会继承62616964757a686964616fe4b893e5b19e31333365666236该方法。它返回对象的一个String表示,并且对于调试非常有帮助。然而对于默认的toString()方法往往不能满足需…

java calendar 毫秒_java Calendar(将时间精确到毫秒)

package com.neusoft.date;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;public class RiQi{public static void main(String []args){System.out.println(new Date());//calendar可以将时间精确到毫秒Calendar calendar new Gregori…

java 1000到9999_java – 可以0.99999999999乘以四舍五入到1.0?

如果你用someInt(> 0)乘以低于1.0的最大值,结果永远不会是someInt。这可以穷尽地测试整数,像这样:Double greatestLessThanOne Double.longBitsToDouble(4607182418800017407L);// Assert that greatestLessThanOne is indeed the larges…

mysql 表 类型_mysql表类型

MySQL支持6种不同的表类型:BDB、InnoDB、HEAP、ISAM、MERGE以及MyISAM。其中 BDB,InnoDB单独属于一类,称为“事务安全型”(transaction-safe),其余的表类型属于第二类,称为“非事务安全型”(non- transaction-safe)。事务安全型BD…

java软件工程_java复习

计算机一些物理装置按系统结构的要求构成一个有机整体为计算机软件运行提供物质基础。计算机硬件:CPU、主板(motherboard)、内存(memory)、电源、主机箱、硬盘、显卡、键盘、鼠标、显示器等IO:input输入(鼠标键盘)、output输出(显示器音响)冯诺依曼体系结…

python偶数分解成两个素数之和_偶数 2021218918 ,有多少种方法分解成两个素数之和?...

对于上面问题2N2021218918,满足“pq2N”的素数对(p,q)的个数真值为3289208个。下面对这个值进行理论探求分析,请大家不吝赐教!下面先来进行基于小素数因子机理哥猜数分析:即对于大于2的偶数2N的小素数因子t,t∈A{≤(2N…

2008r装mysql_RMySQL安装及操作(详细版)

系统配置:Windows XP 32位R 3.1.1一、安装RMySQL:1,安装RTools并配置环境变量:我的电脑——属性——高级——环境变量,在系统变量一栏中选择PATH,点击编辑,在后面添加RTools的路径(如:D:\Rtools\bin;D:\Rtools\gcc-4.6.3\bin;D:\R…

apache 编译php mysql_apache静/动态编译在apache+php+mysql应用

【IT168 服务器学院】我想大家有不少都成功实现apachephpmysql,网上的文章也有不少,但我发现不少文章都是抄来抄去,并且没有说明白编译的方式,有的索性apache1.3的编译方法原封不动地搬过来套在apache2.0,显然误导一些…

java getparametermap_重写getParameterMap后,报错 ,

想做个参数过滤功能,如何修改,或者其他实现方式ServletExcludeHadler类在HttpServletRequestWrapper类里重写了getParameterMap现在报错java.lang.ClassCastException: org.apache.catalina.util.ParameterMap cannot be cast to java.util.HashMapat co…

java sdcard path_更改 android 文件存放目录 getWritablePath() 为sdCard

CCFileUtils::sharedFileUtils()->getWritablePath() 默认为 /data/data/prjName/"Java_org_cocos2dx_lib_Cocos2dxHelper.h" 的 std::string getFileDirectoryJNI() 方法通过 jni 调用 org.cocos2dx.lib.Cocos2dxHelper.getCocos2dxWritablePath() 获取具体&qu…