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

这个从字面意思来看呢。就是查询类型,它主要就是来区别普通查询、联合查询、子查询等。

他有六种类型:

  1. Simple:简单查询,查询不包含子查询和union

    explain SELECT * from student:可以看到,这个sql的explain执行计划上的select_type就是simple

  1. Primary:对于union、union all、子查询的大查询,最左侧的就是primary,复杂查询中最外层的select

    explain SELECT * from student union select * from student

  2. Derived:包含在from子句中的子查询,MySQL会将结果存放在一个临时表中,也称为派生表

    explain SELECT * from (SELECT s1.* from student s1 union SELECT s2.* from student s2) k

  3. Union:在union中的第二个和随后的select()

    其实3、4、5可以使用同一条sql:

  1. Union result:从union临时表检索结果的select

  2. Subquery:包含在select中的子查询(不在from子句中),select查的字段中的信息。

    explain SELECT student.*,(SELECT name from student where name=‘name1’) from student where name=‘name1’

table

这个就是当前行所执行的表,当然了,如果表定义了别名的话,那么就会显示别名。

Partitions

分区,也就是查询的表所在的分区,如果是NULL的话,就代表该表没有被设置分区。

type

该行查询所使用的访问类型,他的值有十多种,但是这些我们没有必要全部知道,这里我列出来最常见的八种,这八种类型的效率就代表从好到差:

  1. System:这个是效率最高的,比如像where id=xxxx,但是在这里有个点我要说一下,就是啥吧,在MySQL5.7版本之前使用这类sql是可以出现System类型的,但是在5.7版本之后呢,就不会出现这个System类型了,转而是以Const类型来替代,也就是下面这种。

  2. Const:mysql能对查询部分进行优化并将其转化为常量,用于primary key或者unique key的所有列与常数比较时,所以表最多只有一个匹配行,读取一次,速度比较快,

    对primary key或者unique key字段进行的查询,就是const

    select * from (select *from film where id=1)tmp;

  3. 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

  4. Ref:代表在非唯一性索引或者非主键上进行的查询。

    EXPLAIN SELECT * from student where name=‘name1’

  5. Ref_or_null,与上面类似,但是可以搜索值为null的行

    EXPLAIN SELECT * from student where name=‘namepro’ or name is null

  6. Range:范围扫描,一般在in、between、>、<、>=等情况下使用,使用一个索引来检索给定范围的行。

    EXPLAIN SELECT * from student where id>1

  7. Index:即使全表扫描,我们在表中也设置有主键索引,此时会走索引,

    select count(*) from student

  8. 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用法详解相关推荐

  1. 【MySQL】explain 用法详解

    [MySQL]explain 用法详解   explain命令主要来查看SQL语句的执行计划,查看该SQL语句有没有使用索引,有没有做全表扫描等.它可以模拟优化器执行SQL查询语句,从而知道MySQL ...

  2. pdo mysql limit_PHP mysql中limit用法详解(代码示例)

    在MySQL中,LIMIT子句与SELECT语句一起使用,以限制结果集中的行数.LIMIT子句接受一个或两个offset和count的参数.这两个参数的值都可以是零或正整数. offset:用于指定要 ...

  3. mysql的explain怎么看_mysql中explain用法详解

    如果在select语句前放上关键词explain,mysql将解释它如何处理select,提供有关表如何联接和联接的次序. explain的每个输出行提供一个表的相关信息,并且每个行包括下面的列: 1 ...

  4. explain mysql怎么用_mysql中explain用法详解

    EXPLAIN用于SELECT语句中的每个表返回一行信息.表以它们在处理查询过程中将被MySQL读入的顺序被列出 如果在select语句前放上关键词explain,mysql将解释它如何处理selec ...

  5. MySQL中EXPLAIN命令详解

    EXPLAIN显示了MySQL如何使用索引来处理SELECT语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上EXPLAIN就可以了: 如: EXPLA ...

  6. mysql中member_Membership用法详解

    用户与角色管理在asp.net2.0中是通过Membership和Roles两个类来实现的. Membership:用户成员账号管理,用户名.密码.邮箱等 Roles:负责用户和群组之间关系管理. l ...

  7. mysql increment_mysql中auto_increment用法详解

    在mysql中AUTO_INCREMENT类型的属性用于为一个表中记录自动生成ID功能,也就是会自动自增一个ID了,如现在是1下次会自动是2了,就这么简单,下面来看mysql中auto_increme ...

  8. mysql查询优化explain命令详解

    转载自 mysql查询优化explain命令详解 mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式.explain翻译即解释,就是看mysql语句的查询解释计划,从解 ...

  9. MySQL调试--explain命令详解

    原文网址:MySQL调试--explain命令详解_IT利刃出鞘的博客-CSDN博客 简介 本文介绍MySQL的explain命令的用法及其结果的含义. explain作用 概述 在 SELECT 语 ...

最新文章

  1. 【解析】1057 数零壹 (20分)(进制转换)
  2. java 根据类名示例化类_Java类类getProtectionDomain()方法及示例
  3. 小米手机又一产品线退场,大步迈向高端市场!
  4. python替换文件内容_使用python替换文件内容
  5. MVC,MVP 和 MVVM详解
  6. RegeX版本更新至2.0.0.4 加入英文语言包
  7. dwg图纸与dxf图纸的区别?
  8. python数据建模优缺点_Python数据分析\建模入门建议
  9. 办公室计算机应用简单知识,新入职办公室人员基础电脑操作知识.doc
  10. The repository 'http://ppa.launchpad.net/octave/stable/ubuntu bionic Release' does not have a Releas
  11. 为什么面试完,总是让你回去等通知?
  12. 经验分享 | 关于NASA VIIRS数据
  13. python后台开发性能问题_《Python高性能编程》——2.14 确保性能分析成功的策略-阿里云开发者社区...
  14. [附源码]JAVA+ssm交通违章举报平台(程序+Lw)
  15. 【OpenCV】- 图像修复
  16. 学校开展计算机教学的简报,教学工作简报(2019年第5期)
  17. js监听苹果手机自带按钮返回事件
  18. shell脚本监控网站是否正常
  19. C语言:用贪心策略计算活动安排问题的最优解
  20. 好车主互助|中国互联网变革史:工具类互联网企业的跌宕起伏

热门文章

  1. git pull代码报错 key_exchange_identification
  2. 国家省市县标准区域码
  3. 探索格式塔心理学法则:打造令人愉悦的界面设计!
  4. 杨 et al_2016_工业控制系统入侵检测技术综述
  5. redis 挖矿木马清除
  6. springboot+mysql健康饮食推荐系统源码49517
  7. 单片机不起振原因分析(转)
  8. AutoCAD2012因为.net而导致安装失败的解决办法
  9. Android Studio的模拟器卡死、死机问题解决方法
  10. 【UE4】从零开始制作战斗机(中:飞机操控逻辑)