explain使用方法及结果分析
explain使用方法及结果分析
- 1. 什么是`explain`命令
- 2. 如何使用`explain`命令
- 3. 分析`explain`命令执行结果
- 3.1. `id`
- 3.2. `select_type`
- 3.3. `table`
- 3.4. `type`
- 3.5. `possible_keys`
- 3.6. `key`
- 3.7. `key_len`
- 3.8. `ref`
- 3.9. `rows`
- 3.10. `filtered`
- 3.11. `Extra`
1. 什么是explain
命令
explain
命令是查看MySQL
查询优化器如何执行查询的主要方法,可以很好地分析SQL
语句的执行情况。
每当遇到执行慢的SQL
,就可以使用explain
命令来检查SQL
的执行情况,并根据运行结果进行分析,采用相应的方法对SQL
语句进行优化。
通过explain
我们可以获得以下信息:
- 表的读取顺序
- 数据读取操作的操作类型
- 哪些索引可以使用
- 哪些索引被实际使用
- 表之间的引用
- 每张表有多少行被优化器查询
2. 如何使用explain
命令
只需在SQL
语句前使用explain
关键字即可;
如:
EXPLAIN SELECT * FROM student_info WHERE student_id = 'A01234567';
3. 分析explain
命令执行结果
在执行了explain
命令后,会得到一个含有很多列的输出结果,下面一起来看一下各个列所代表的含义吧。
3.1. id
- 如果多行
id
相同,执行顺序由上至下 ; - 如果是子查询,
id
的序号会递增,id
值越大优先级越高,越先被执行; - 如果多行
id
有的相同有的不同,那么id
相同的可以认为是一组,同一组中从上往下执行;id大的组优先执行;
3.2. select_type
select_type
所显示的是SELECT
的类型:
SIMPLE
:简单的SELECT
,没有使用UNION
或者子查询;PRIMARY
:最外层SELECT
;UNION
:第二层,在SELECT
之后使用了UNION
;DEPENDENT UNION
:UNION
语句中的第二个SELECT
,依赖于外部子查询;UNION RESULT
:UNION
的结果;SUBQUERY
:子查询中的第一个SELECT
;DEPENDENT SUBQUERY
:子查询中的第一个SELECT
,取决于外面的查询;DERIVED
:导出表的SELECT
(FROM
子句的子查询);
3.3. table
显示对应行正在访问哪个表,通常是表名或者该表的别名(如果SQL
定义了别名);
3.4. type
type
所显示的是查询使用了哪种类型,所有type
按照从好到坏的顺序排列如下:
system > const > eq_ref > ref > range > index > all
;
system
:表只有一行记录(等于系统表),这是const
类型的特列,平时不会出现,这个也可以忽略不计;const
:表示通过索引一次就找到了,const
用于primary key
或者unique
索引。因为只匹配一行数据,所以很快。如将主键置于where
语句中,MySQL
就能将该查询转换为一个常量;eq_ref
:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描;ref
:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体;range
:只检索给定范围的行,使用一个索引来选择行,key
列显示使用了哪个索引,一般就是在你的where
语句中出现between
,<
,>
,in
等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引;index
:全表扫描,index
与all
区别为index
类型只遍历索引树。这通常比all
快,因为索引文件通常比数据文件小。(也就是说虽然all
和index
都是读全表,但index
是从索引中读取的,而all
是从硬盘读取的) ;all
:全表扫描,将遍历全表以找到匹配的行 ;
3.5. possible_keys
这一列显示了查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的。
查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。
3.6. key
显示MySQL
决定采用哪个索引来优化对该表的访问。如果为NULL
,则没有使用索引。(可能原因包括没有建立索引或索引失效)
如果该索引没有出现在possible_keys
列中,那么MySQL
选用它是出于另外的原因如可能选择了一个覆盖索引,哪怕没有where
子句。
换言之,possible_keys
揭示了哪一个索引有助于高效行查找,而key
显示的是优化采用的哪一个索引可以最小化查询成本。
3.7. key_len
显示了MySQL
在索引里使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。
3.8. ref
显示哪个字段或常数与key
一起被使用。
3.9. rows
表示MySQL
预估的为了找到所需的行而要读取的行数。根据表的统计信息和索引的选用情况,这个估算可能很不精确。通过把所有rows
列值相乘,可以粗略的估算出整个查询会检查的行数。越小越好。
3.10. filtered
这一列是MySQL 5.1
里新加的,它显示的是针对表里符合某个条件(where
子句或联结条件)的记录数所做的一个悲观估算的百分比。
3.11. Extra
这一列包含的是不适合在其他列显示的额外信息。常见的最重要的值有:
Using index
表示MySQL
将使用覆盖索引,以避免回表查询。不要把覆盖索引和index
访问类型混淆了;Using where
表示MySQL
服务器将在存储引擎检索行后再进行过滤;Using temporary
表示MySQL
在对查询结果排序时会使用一个临时表;Using filesort
表示MySQL
会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。MySQL
有两种文件排序算法,两种都可以在内存或磁盘上完成。但explain
不会告诉你MySQL
使用的是哪种,也不会告诉你排序是在内存还是磁盘上完成;Range checked for each record(index map:N)
表示没有好用的索引,新的索引将在联接的每一行上重新估算。N
是显示在possible_keys
列中索引的位图,并且是冗余的;Using union
表示MySQL
运用了索引合并策略,索引合并策略有时是一种优化的结果,但实际上更多时候说明了表上的索引建的很糟糕。
explain使用方法及结果分析相关推荐
- 【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )
文章目录 一.使用 for 循环遍历集合 二.使用 each 方法遍历集合 三.集合的 each 方法返回值分析 四.完整代码示例 一.使用 for 循环遍历集合 使用 for 循环 , 遍历集合 , ...
- 灰帽黑客:正义黑客的道德规范、渗透测试、攻击方法和漏洞分析技术(第3版)
基本信息 灰帽黑客:正义黑客的道德规范.渗透测试.攻击方法和漏洞分析技术(第3版)原书名: Gray Hat Hacking: The Ethical Hacker's Handbook, Third ...
- 深入java并发包源码(三)AQS独占方法源码分析
深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...
- getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...
本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...
- yaahp层次分析法步骤_综合评价方法之层次分析法,选择再也难不倒你!
在日常生活中, 我们常常面临着各种各样的选择. 比如你想去北京.上海.广州旅游, 但是由于种种原因, 你只能选择一个地点去旅游, 那么哪一种选择是最优的呢? 有没有较为科学的方法帮助我们更好地选择呢? ...
- java equals 判断空_Java 判断字符串是否为空的三种方法与性能分析
[java中判断字符串是否为数字的三种方法 1>用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = s ...
- 降维后输入分类器分类时报错_逻辑回归解决多分类方法及其优缺点分析
众所周知,逻辑回归常用于解决二分类任务,但是在工作/学习/项目中,我们也经常要解决多分类问题.本文总结了 3 种逻辑回归解决多分类的方法,并分析了他们的优缺点. 一.One-Vs-Rest 假设我们要 ...
- 放大电路分析方法、图解法分析放大电路
放大电路分析方法.图解法分析放大电路 一.本文介绍的定义 二.放大电路分析方法 三.图解法 一.本文介绍的定义 放大电路分析.图解法.微变等效电路法.静态分析.动态分析.直流通路.交流通路.单管共射放 ...
- CSS、JavaScript和Ajax实现图片预加载的三大方法及优缺点分析
预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...
最新文章
- 数字营销,带动汽车销量增长
- 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.
- Core Animation简介
- Python 字符串操作方法大全
- 三星s窗口共享android,三星s窗口共享(SideSync pc端)
- 小米用户画像_腾讯企鹅智库发布手机品牌用户画像:华为一二线城市用户少于小米...
- unity 继承了 获取_为什么说Unity能用单纯脚本实现的功能,尽量避免继承MonoBehavior,保持纯粹性?...
- PyQt5 Pyinstaller时出现错误Cannot find PyQt5 plugin directories
- 输出正反等腰三角形(菱形)
- Unity3D(一) 操作界面及游戏常识
- andrioid 图像视频处理
- HFSS - 侧馈矩形微带天线设计与仿真
- android 4.4.2海信电视,ROOT海信电视Android4.0的详细步骤
- 华图教育计算机,计算机vf考试考什么
- 我奋斗了十八年不是为了和你一起喝杯咖啡
- STM32L476应用开发之七:流量的PID控制
- HTML做一个节日页面【六一儿童节】纯HTML代码
- 身在国外,除了克服语言障碍,还得背好99乘法表
- 天线开路短路检测原理_LEA-5S的天线开路检测问题
- 开源究竟有什么魅力?听完这 4 个故事你也许会明白
热门文章
- #三、经典股市理论与博弈论、随机性的前世今生、恩怨情仇 (一)、经典理论与博弈论的划分
- go是面向对象语言吗?
- 解决网页无法复制粘贴(生活小妙招)
- EL和JSTL表达式
- 知道创宇将参展2016年国家网络安全宣传周
- 交互系统函数$test$plusargs()与$value$plusargs ——字符串函数 $sformatf()与$sformat()的区别与用法
- 基于Android社区养老服务信息平台
- 深入解析WPF编程(奋斗的小鸟)_PDF 电子书
- 1恢复 群晖raid_群晖SHR、RAID1阵列模式拆分、降级为BASIC教程
- Cherry-Pick、Squash Commits、Rebase使用