当前位置:网站首页>Explain详解与实践
Explain详解与实践
2022-08-04 03:53:00 【Laughing_Xie】
Explain是mysql提供的工具,用于分析SQL语句的执行情况
图1.

图2.
show warnings; 查看MySQL内部sql优化的情况

关闭衍生表合并优化,显示更详细的步骤
set session optimizer_switch='derived_merge=off';

涉及三个查询,DERIVED (衍生查询,从user中查), SUBQUERY(子查询,table为 client),这是一个复杂查询 PRIMARY(最外层的,对应的table为 衍生表<derived3> ,derived ,id 为3 )

图3.

select_type:
1.在执行SQL语句过程中,id越大表示执行的优先级越高(也有相同的情况)
DERIVED :一般最先执行,包含在from 之后生成的查询结果集,生成一个临时表。MySQL会将结果存放在一个临时表中,也称为派生表
SIMPLE :查询的语句为简单查询,如图1,没有关联,子查询等情况
PRIMARY :查询包含子查询的时候,对应的是复杂查询中最外层的select 语句
UNION : union之后出现的select语句对应的查询类型、
SUBQUERY :子查询
DEPENDENTSUBQUERY : 取决于外面的查询 目前第一步从user表中查询;
2.然后执行的类型为PRIMARY包含有子查询,从派生表里面查询数据 ;
3.目前表是没有分区的 所以partitions为空
4.type 代表的是当前通过什么样的方式对数据库表进行访问,关联类型或者访问类型(MySQL决定如何查找表中的行,查找数据行记录的大概范围)
一般常用 system >const >eq_ref >ref >range>index>ALL,一般需要保证查询达到range级别,最好达到ref级别,效率逐渐递减。
NULL: MySQL能够在优化阶段分解查询语句,在执行阶段用不着再访问表或索引。例如查找min(id),底层B+Three本就是排好序了的,非常容易拿到。单独查找索引即完成了,不需要执行的时候访问表。

system : 该表只有一行,相当于系统表,查询速度很快,读取1次,system是const类型的特例,本身结果集就只有一条,如同查常量一样,直接查出来的。
const : 说明在进行数据查询的时候,命中了primary key或唯一索引,此类数据查询非常快
eq_ref : primary key或者unique key 索引的所有部分被连接使用,最多只会返回一条符合条件的记录。这可能是在const之外最好的连接类型了

ref : 如果命中的索引是二级索引,不是unique key,type是ref,如果是多字段的联合索引,根据最左匹配原则,从联合索引的最左侧开始连续多个列的字段进行等值比较也是ref类型。
ref_or_null : 类似于ref ,区别在于会额外搜索包含NULL值的行
unique_subquery : 在where条件中的关于in的子查询集合
index_subquery : 用于非唯一索引,可以返回重复值
range : 使用了索引进行行数据检索,只对指定范围内的行数据检索。就是针对的一个有索引的字段,在指定的范围中检索数据 如果where 语句中使用 between、and 、< 、> 、<=、 in 等条件都是range

index : 与ALL都是读全表,区别在于index是走二级索引(全索引扫描),而ALL是从硬盘中读取。【如果查找的结果集,即在二级索引有,在主键索引也有,有时候会优化选择走二级索引,因为主键索引整体比二级索引大,优先扫描二级索引,所占磁盘量也小,因为比主键索引小;具体如何选,内部有自己的算法】

以下是全表扫描,如果是index,则是全索引扫描
ALL : 扫描的主键索引,不是从根节点开始走的,而是从最小的值开始,进行遍历全表扫描。进行数据匹配,此时的数据查询性能最差(读取的磁盘数据量比index更大一点)。
5.possible_keys (和key放的都是这张表的索引)
表示哪些索引可以按MySQL的优化器进行选择,也就是索引候选者有哪些。
6. key
7. key_len
sql语句执行过程中,所具体用到的索引的长度(比如联合索引,只用了其中一个,通过key_len也可以区分用到的是哪个索引,如果都用到就是总长度),和实际的字段属性以及是否为null都有关系,长度有不同的计算方式,一般tinyint:1字节,smallint:2字节 ,int:4字节 bigint:8字节 ,date: 3字节 ,timestamp:4字节,datetime:8字节 ,如果字段运行为空,还需要一个字节来记录是否为NULL
8.ref (条件的引用方式)
如果使用字段进行常量等值查询时ref 此处为const ;当查询条件中使用了表达式或者函数ref 为 func ;其他的显示 null;
9.rows
执行查询的时候必须检查的行数,行数越少,效率越高!!
10. filtered
是一个百分比的值,rows*fitered/100 可以估算出将要和explain 中前一个表进行连接的行数(前一个表指explain中的id值比当前表id值小的表)
11.extra
其他列不显示的额外信息在此列进行展示。
Using index :数据库使用了覆盖索引,查询的列被索引覆盖,使用到覆盖索引会比较快
Using where : 查询时未找到可用的索引,进而通过where条件过滤获取所需数据,并不是所有的带where语句的查询都会显示这个。
Using temporary : 查询后结果需要用临时表来存储,一般在排序或者分组查询时用到
Using filesort : 此类型表示无法利用索引完成指定的排序操作,也就是order by的字段实际没有索引,因此此类SQL是需要进行优化的。
边栏推荐
- 2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
- The Shell function
- 机器学习模型的“可解释性”
- How to systematically plan and learn software testing?
- 自定义通用分页标签02
- 企业直播风起:目睹聚焦产品,微赞拥抱生态
- Senior PHP development case (1) : use MYSQL statement across the table query cannot export all records of the solution
- 2千兆光+6千兆电导轨式网管型工业级以太网交换机支持X-Ring冗余环网一键环网交换机
- Introduction to the memory model of the JVM
- 汇编语言之栈
猜你喜欢
随机推荐
创新互融|华秋赋能助力OpenHarmony生态硬件开发落地
仿牛客论坛项目梳理
软件测试如何系统规划学习呢?
SQL query String field less than 10 how to check
初识Numpy
if,case,for,while
"Introduction to nlp + actual combat: Chapter 8: Using Pytorch to realize handwritten digit recognition"
2022年最新海南建筑八大员(材料员)模拟考试试题及答案
Senior PHP development case (1) : use MYSQL statement across the table query cannot export all records of the solution
new Date converts strings into date formats Compatible with IE, how ie8 converts strings into date formats through new Date, how to replace strings in js, and explain the replace() method in detail
if,case,for,while
函数,递归以及dom简单操作
Use serve to build a local server
Take care of JVM performance optimization (own note version)
Introduction to the memory model of the JVM
SQL injection in #, - +, - % 20, % 23 is what mean?
用户与用户互发红包/支付宝C2C/B2C现金红包php源码示例/H5方式/兼容苹果/安卓
Mockito unit testing
2022支付宝C2C现金红包PHP源码DEMO/兼容苹果/安卓浏览器和扫码形式
Why use Selenium for automated testing









