1.Explain

Explain可以对sql语句的执行性能进行分析。使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈

2官网介绍
http://dev.mysql.com/doc/refman/5.5/en/explain-output.html

3作用

通过explain可以知道下列信息

1)表的读取顺序

2)哪些索引可以使用

3)哪些索引被实际使用

4)数据读取操作的操作类型

5)表之间的引用

6)每张表有多少行被优化器查询

4使用

EXPLAIN + SQL

5EXPALIN展示的结果的信息

5.1 ID

id是select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

id相同,执行顺序由上至下

id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id相同不同,同时存在。id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

1)实例

建表

CREATE TABLE `jcustomer` (
`CustomerNo` int(11) NOT NULL AUTO_INCREMENT,
`Name` varchar(60) DEFAULT NULL,
`Sex` varchar(12) DEFAULT NULL,
`remark` varchar(100) DEFAULT NULL,
PRIMARY KEY (`CustomerNo`)
) ENGINE=InnoDB AUTO_INCREMENT=20000763 DEFAULT CHARSET=utf8;
CREATE TABLE `jinmatehis` (
`CustomerNo` int(11) NOT NULL COMMENT '客户编号 和customer的一样',
`Name` varchar(20) NOT NULL COMMENT '姓名',
`Sex` varchar(4) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`CustomerNo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='住户表';
CREATE TABLE `abilityassessrecord` (
`recordno` int(11) NOT NULL AUTO_INCREMENT,
`customerno` int(11) NOT NULL COMMENT '客户编号,对应jcustomer主键',
`customername` varchar(20) DEFAULT NULL COMMENT '客户姓名',
 `sex` varchar(4) DEFAULT NULL COMMENT '客户性别',
`roomno` bigint(20) NOT NULL COMMENT '住户房间编号',
`remark` varchar(100) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`recordno`)
) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COMMENT='住户记录表';
EXPLAIN SELECT * FROM jcustomer c LEFT JOIN jinmatehis i ON c.CustomerNo = i.CustomerNo 

执行顺序就是先查的表c,再查询表i

2)实例

EXPLAIN SELECT *,(SELECT id FROM parameters where id = 1 ) id  FROM jcustomer c LEFT JOIN jinmatehis i ON c.CustomerNo = i.CustomerNo 

执行顺序就是parameters、c、i

5.2select_type

查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询,知道即可

1、SIMPLE

简单的 select 查询,查询中不包含子查询或者UNION

2、PRIMARY

查询中若包含任何复杂的子部分,最外层查询则被标记为Primary

3、DERIVED

在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询, 把结果放在临时表里。

4、SUBQUERY

在SELECT或WHERE列表中包含了子查询

5、DEPENDENT SUBQUERY

在SELECT或WHERE列表中包含了子查询,子查询基于外层

6、UNCACHEABLE SUBQUREY

无法被缓存的子查询

7、UNION

若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED

8、UNION RESULT

从UNION表获取结果的SELECT

5.3table

显示这一行的数据是关于哪张表的

5.4type

type显示的是访问类型,是较为重要的一个指标

结果值从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range(尽量保证) > index > ALL

常见的几个值:

system>const>eq_ref>ref>range>index>ALL      一般来说,得保证查询至少达到range级别,最好能达到ref。

1、system

表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计

2、const

表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快

EXPLAIN SELECT * FROM jcustomer WHERE CustomerNo = 1    #CustomerNo是主键

3、eq_ref

唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

EXPLAIN SELECT * FROM jcustomer c LEFT JOIN jinmatehis i ON c.CustomerNo = i.CustomerNo  #CustomerNo是主键

4、ref

非唯一性索引扫描,返回匹配某个单独值的所有行.本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体

ALTER table abilityassessrecord ADD INDEX idx_abilityassessrecord_customername (customername);

EXPLAIN SELECT * FROM abilityassessrecord WHERE customername = 'GY'

5、range

只检索给定范围的行,使用一个索引来选择行。

EXPLAIN SELECT * FROM abilityassessrecord WHERE recordno > 10

6、index

index与ALL区别为index类型只遍历索引树。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)

EXPLAIN SELECT recordno FROM abilityassessrecord 

7、all

将遍历全表以找到匹配的行

EXPLAIN SELECT * FROM abilityassessrecord 

8、index_merge

在查询过程中需要多个索引组合使用,通常出现在有 or 的关键字的sql中

9、ref_or_null

对于某个字段既需要关联条件,也需要null值的情况下。查询优化器会选择用ref_or_null连接查询。

10、index_subquery

利用索引来关联子查询,不再全表扫描。

11、unique_subquery

该联接类型类似于index_subquery。 子查询中的唯一索引

5.5 possible_keys

显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

EXPLAIN SELECT * FROM abilityassessrecord WHERE recordno > 10 and customername = 'asd'

这里可能用到两个索引PRIMARY和idx_abilityassessrecord_customername,实际用到idx_abilityassessrecord_customername

5.6 key

实际使用的索引

5.7key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。 key_len字段能够帮你检查是否充分的利用上了索引

5.8ref

哪些列或常量被用于查找索引列上的值

5.9rows

rows列显示MySQL认为它执行查询时必须检查的行数

5.10Extra

其它的重要的额外信息

5.10.1Using filesort

说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。效率较低

5.10.2Using temporary

使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by。效率很差

5.10.3USING index

表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!
如果同时出现using where,表明索引被用来执行索引键值的查找;
如果没有同时出现using where,表明索引只是用来读取数据而非利用索引执行查找。

5.10.4Using where

表明使用了where过滤

5.10.5using join buffer

使用了连接缓存

5.10.6impossible where

where子句的值总是false,不能用来获取任何元组。如where id=1 and id = 2

5.10.7select tables optimized away

在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。

mysql13 sql优化-explain的更多相关文章

  1. mysql 开发进阶篇系列 2 SQL优化(explain分析)

    接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...

  2. MySQL索引原理及SQL优化

    目录 索引(Index) 索引的原理 b+树 MySQL如何使用索引 如何优化 索引虽好,不可滥用 如何验证索引使用情况? SQL优化 explain查询执行计划 id select_type tab ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...

  4. 浅谈SQL优化入门:2、等值连接和EXPLAIN(MySQL)

    1.等值连接:显性连接和隐性连接 在<MySQL必知必会>中对于等值连接有提到两种方式,第一种是直接在WHERE子句中规定如何关联即可,那么第二种则是使用INNER JOIN关键字.如下例 ...

  5. SQL优化 MySQL版 -分析explain SQL执行计划与笛卡尔积

    SQL优化 MySQL版 -分析explain SQL执行计划 作者 Stanley 罗昊 [转载请注明出处和署名,谢谢!] 首先我们先创建一个数据库,数据库中分别写三张表来存储数据; course: ...

  6. SQL优化笔记一:索引和explain

    目录 为什么需要优化SQL SQL优化的重点 索引 索引的结构 索引的优缺点总结: 索引的分类 索引操作 B树 实战 问题 数据库方面,我会使用MySQL来讲解 为什么需要优化SQL 性能低,执行时间 ...

  7. Explain 执行计划 和 SQL优化

    Explain 介绍 在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要 ...

  8. SQL优化(三)—— 索引、explain分析

    SQL优化(三)—— 索引.explain分析   一.什么是索引 索引是一种排好序的快速查找的数据结构,它帮助数据库高效的查询数据 在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据 ...

  9. 不会看 Explain执行计划,劝你简历别写熟悉 SQL优化

    昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴. 聊着聊着突然说到他上午面试了一个工作6年的程序员, ...

  10. mysql sql优化实例

    mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...

随机推荐

  1. Windows Server 2019 安装 Oracle 19C RAC(VMWare虚拟机环境)

    软件 Windows Server 2019 Standard Oracle 19C Oracle Grid 19 VMware Workstation 16 规划 共享存储,使用Windows Se ...

  2. WIN10使用SSH连接VMWare16 Pro的CentOS8.4(保姆级)

    目录 本机环境 配置连接 本机环境 连接工具用的是MobaXterm,下载地址https://mobaxterm.mobatek.net/download.html VMWare16 Pro Cent ...

  3. FluentFTP能连接却报未将对象引用设置到对象的实例。

    本来项目中用的好好的FTP下载传输,不知道从什么时候开始读取不到了,也上传不了.实际读取的是本地缓存的.因为同事上传不了文件和图片才发现.上源码! #region 下载文件 static byte[] ...

  4. 轻松玩转awk

    awk的处理方式 awk一次处理一行内容 awk对每行可以进行切片处理 例如 awk -F ':' '{print $1}' /etc/password -F指定每一行分割符号,这样就把被每行被:分割 ...

  5. view-design tabpane禁用后renderHeader失效问题

    需求是这样的 在tabPane的renderHeader里面添加hover事件(使用组件自带的Poptip)能显示提示 其实这个不算是问题,设置disabled属性后,原本的元素上面添加了 ivu-t ...

  6. static_cast和dynamic_cast

    C++的强制类型转换,除了继承自C语言的写法((目标类型)表达式)之外,还新增了4个关键字,分别是:static_cast.dynamic_cast.const_cast和reinterpret_ca ...

  7. 痞子衡嵌入式:我被邀请做贸泽电子&与非网联合推出的《对话工程师》节目嘉宾

    <对话工程师>是「贸泽电子」赞助.「与非网」制作的一档网络节目,自2022年11月起,邀请不同技术领域的资深工程师,聊聊开发过程中的经验感悟,栏目共 10 期,痞子衡有幸被邀请做了第 4 ...

  8. 6、SQL模糊查询LIKE concat用法

    concat用来拼接查询的字符串: SELECT * FROM `page_demo` WHERE name LIKE concat('%',#{name},'%') 模糊查询: 1.%代表零个或多个 ...

  9. sqlSession封装以及CRUD的实现

    sqlSession封装以及CRUD的实现 封装MyBatisUtil dao 定义方法 映射文件写sql语句 daoimpl实现类 实现方法 test类测试方法 整体结构

  10. openEuler 部署Kubernetes(K8s)集群

    前言 由于工作原因需要使用 openEuler,openEuler官方文档部署K8s集群比较复杂,并且网上相关资料较少,本文是通过实践与测试整理的 openEuler 22.03 部署 Kuberne ...