MySQL中Explain用法详解
Explain简介
我们在写后端程序的时候,通常会写sql来查询数据,如果是单表查询的时候,那直接select就完事了,但是如果是连表查询数据量也不小的话,就造成了查询速度会比较慢,那么我们该怎么知道我的sql的实际执行情况,它有没有走索引,执行效率是啥呢?数据库就给我们提供了这么一种功能,这个就是本文的重点了:expalin。
通过explain,我们可以获取到sql语句的执行计划,比如像表的读取顺序,使用了哪些索引等等。但是各个数据库的explain执行计划所展示出的内容是不太相同的,这里我们就来看MySQl中的执行计划explain。
先来跑两行SQL作为本文的例子:
CREATE TABLE `project` (`id` int(12) NOT NULL,`project_name` varchar(32) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_name` (`project_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into project (id,project_name)
values ('1', 'project1 '),
('2', 'projectplus'),
('3','projectpro');CREATE TABLE `student` (`id` int(12) NOT NULL,`name` varchar(32) DEFAULT NULL COMMENT '姓名',`project_id` int(12) DEFAULT NULL COMMENT '课程编码',PRIMARY KEY (`id`),KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;insert into student (id,name,project_id)
values ('1','name1','1'),
('2','nameplus','2'),
('3','namepro','3');
我们来执行一条最简单的sql,一探expalin结果的究竟。
explain SELECT * from student
控制台:
可以看到,显示出来的参数还是很多的,那这些都是什么意思呢?接下来我们一个一个来进行分析一下。
id
id这一列代表sql语句执行的顺序,id值越大的行,越先执行,id值相同的情况下,执行顺序就从上往下执行。一般来说,有多少个select,就会有多少个id。
select_type
这个从字面意思来看呢。就是查询类型,它主要就是来区别普通查询、联合查询、子查询等。
他有六种类型:
Simple:简单查询,查询不包含子查询和union
explain SELECT * from student:可以看到,这个sql的explain执行计划上的select_type就是simple
Primary:对于union、union all、子查询的大查询,最左侧的就是primary,复杂查询中最外层的select
explain SELECT * from student union select * from student
Derived:包含在from子句中的子查询,MySQL会将结果存放在一个临时表中,也称为派生表
explain SELECT * from (SELECT s1.* from student s1 union SELECT s2.* from student s2) k
Union:在union中的第二个和随后的select()
其实3、4、5可以使用同一条sql:
Union result:从union临时表检索结果的select
Subquery:包含在select中的子查询(不在from子句中),select查的字段中的信息。
explain SELECT student.*,(SELECT name from student where name=‘name1’) from student where name=‘name1’
table
这个就是当前行所执行的表,当然了,如果表定义了别名的话,那么就会显示别名。
Partitions
分区,也就是查询的表所在的分区,如果是NULL的话,就代表该表没有被设置分区。
type
该行查询所使用的访问类型,他的值有十多种,但是这些我们没有必要全部知道,这里我列出来最常见的八种,这八种类型的效率就代表从好到差:
System:这个是效率最高的,比如像where id=xxxx,但是在这里有个点我要说一下,就是啥吧,在MySQL5.7版本之前使用这类sql是可以出现System类型的,但是在5.7版本之后呢,就不会出现这个System类型了,转而是以Const类型来替代,也就是下面这种。
Const:mysql能对查询部分进行优化并将其转化为常量,用于primary key或者unique key的所有列与常数比较时,所以表最多只有一个匹配行,读取一次,速度比较快,
对primary key或者unique key字段进行的查询,就是const
select * from (select *from film where id=1)tmp;
eq_ref:primary key或者unique key索引的所有部分被连接使用,最多只会返回一条符合条件的记录,这是在const之外最好的连接类型了,简单的select查询不会出现这种type
使用join进行连表查询时,对unique key或者primary key字段进行关联条件
explain SELECT * from student left join project on student.project_id=project.id
Ref:代表在非唯一性索引或者非主键上进行的查询。
EXPLAIN SELECT * from student where name=‘name1’
Ref_or_null,与上面类似,但是可以搜索值为null的行
EXPLAIN SELECT * from student where name=‘namepro’ or name is null
Range:范围扫描,一般在in、between、>、<、>=等情况下使用,使用一个索引来检索给定范围的行。
EXPLAIN SELECT * from student where id>1
Index:即使全表扫描,我们在表中也设置有主键索引,此时会走索引,
select count(*) from student
All:全表扫描
EXPLAIN SELECT * from student
一般保证查询至少达到range级别,最好能达到ref。
possible_keys
表示该行查询可能使用到的查询索引,它是理论上的,某些情况下,是与实际用的索引不同的。
key
上面是可能使用到的索引,而这个呢,就是该行实际使用到的索引。
key len
表示索引中所使用的字节数,可通过该列计算查询中使用的索引长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,并不是通过表内检索出的。
ref
显示关联的字段。如果使用常数等值查询,则显示const,如果是连接查询,则会显示关联的字段。
rows
rows列代表该行查询所涉及到多少行数据,而非最终的结果。
Filered
这个是个百分比,rowsfiltered的值与前表产生交互,比如rows是1000,filtered是10,那么就说明会有10000*0.1=100的值与前表交互,
返回结果的行数占查询的行数的比例
explain SELECT * from student where id=‘1’
Extra
这一列展示的是额外信息。
Using index:表示使用索引,但是select的字段需要设置索引,如果有order by的话,那么order by里面的字段也要设置了索引。
explain select name from student order by name
Using where:使用where语句。
explain select * from student where id > 1;
Using temporary:使用临时表
explain select distinct project_id from student;这种就是Using temporary,因为表中没有distinct project_id这种字段,因此是先建立个临时表,然后对这个临时表来进行去重,这种一般是需要优化的,首先可以使用索引来进行优化。
Using filesort:采用文件扫描对结果进行计算排序,效率很差,对于排序,只有select字段与order by字段都被覆盖的话,才允许使用Using index
Explain select * from student order by name(Using filesort)
总结
以上呢就是关于MySQL的explain执行计划的内容了,虽然他的显示出来的字段是比较多的,但是其实它是有的是重要的,有的则是不那么重要,因此我们其实是没有必要每一列都要彻底搞清楚的。在这里我列几个个人觉得相对重要的属性:id、type、key、ref、extra。如果需要对sql进行优化的话,着重关注这几个就可以。
MySQL中Explain用法详解相关推荐
- 【MySQL】explain 用法详解
[MySQL]explain 用法详解 explain命令主要来查看SQL语句的执行计划,查看该SQL语句有没有使用索引,有没有做全表扫描等.它可以模拟优化器执行SQL查询语句,从而知道MySQL ...
- pdo mysql limit_PHP mysql中limit用法详解(代码示例)
在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...
- mysql的explain怎么看_mysql中explain用法详解
如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序. explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1 ...
- explain mysql怎么用_mysql中explain用法详解
EXPLAIN用于SELECT语句中的每个表返回一行信息.表以它们在处理查询过程中将被MySQL读入的顺序被列出 如果在select语句前放上关键词explain,mysql将解释它如何处理selec ...
- MySQL中EXPLAIN命令详解
EXPLAIN显示了MySQL如何使用索引来处理SELECT语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上EXPLAIN就可以了: 如: EXPLA ...
- mysql中member_Membership用法详解
用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理,用户名.密码.邮箱等 Roles:负责用户和群组之间关系管理. l ...
- mysql increment_mysql中auto_increment用法详解
在mysql中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,也就是会自动自增一个ID了,如现在是1下次会自动是2了,就这么简单,下面来看mysql中auto_increme ...
- mysql查询优化explain命令详解
转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...
- MySQL调试--explain命令详解
原文网址:MySQL调试--explain命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的explain命令的用法及其结果的含义. explain作用 概述 在 SELECT 语 ...
最新文章
- 【解析】1057 数零壹 (20分)(进制转换)
- java 根据类名示例化类_Java类类getProtectionDomain()方法及示例
- 小米手机又一产品线退场,大步迈向高端市场!
- python替换文件内容_使用python替换文件内容
- MVC,MVP 和 MVVM详解
- RegeX版本更新至2.0.0.4 加入英文语言包
- dwg图纸与dxf图纸的区别?
- python数据建模优缺点_Python数据分析\建模入门建议
- 办公室计算机应用简单知识,新入职办公室人员基础电脑操作知识.doc
- The repository 'http://ppa.launchpad.net/octave/stable/ubuntu bionic Release' does not have a Releas
- 为什么面试完,总是让你回去等通知?
- 经验分享 | 关于NASA VIIRS数据
- python后台开发性能问题_《Python高性能编程》——2.14 确保性能分析成功的策略-阿里云开发者社区...
- [附源码]JAVA+ssm交通违章举报平台(程序+Lw)
- 【OpenCV】- 图像修复
- 学校开展计算机教学的简报,教学工作简报(2019年第5期)
- js监听苹果手机自带按钮返回事件
- shell脚本监控网站是否正常
- C语言:用贪心策略计算活动安排问题的最优解
- 好车主互助|中国互联网变革史:工具类互联网企业的跌宕起伏