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

  1. 如果多行id相同,执行顺序由上至下 ;
  2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;
  3. 如果多行id有的相同有的不同,那么id相同的可以认为是一组,同一组中从上往下执行;id大的组优先执行;

3.2. select_type

select_type所显示的是SELECT的类型:

  1. SIMPLE:简单的SELECT,没有使用UNION或者子查询;
  2. PRIMARY:最外层SELECT
  3. UNION:第二层,在SELECT之后使用了UNION
  4. DEPENDENT UNIONUNION语句中的第二个SELECT,依赖于外部子查询;
  5. UNION RESULTUNION的结果;
  6. SUBQUERY:子查询中的第一个SELECT
  7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询;
  8. DERIVED:导出表的SELECTFROM子句的子查询);

3.3. table

显示对应行正在访问哪个表,通常是表名或者该表的别名(如果SQL定义了别名);

3.4. type

type所显示的是查询使用了哪种类型,所有type按照从好到坏的顺序排列如下:
system > const > eq_ref > ref > range > index > all

  1. system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计;
  2. const:表示通过索引一次就找到了,const用于primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where语句中,MySQL就能将该查询转换为一个常量;
  3. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描;
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体;
  5. range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between, <, >, in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引;
  6. index:全表扫描,indexall区别为index类型只遍历索引树。这通常比all快,因为索引文件通常比数据文件小。(也就是说虽然allindex都是读全表,但index是从索引中读取的,而all是从硬盘读取的) ;
  7. 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使用方法及结果分析相关推荐

  1. 【Groovy】集合遍历 ( 使用 for 循环遍历集合 | 使用集合的 each 方法遍历集合 | 集合的 each 方法返回值分析 )

    文章目录 一.使用 for 循环遍历集合 二.使用 each 方法遍历集合 三.集合的 each 方法返回值分析 四.完整代码示例 一.使用 for 循环遍历集合 使用 for 循环 , 遍历集合 , ...

  2. 灰帽黑客:正义黑客的道德规范、渗透测试、攻击方法和漏洞分析技术(第3版)

    基本信息 灰帽黑客:正义黑客的道德规范.渗透测试.攻击方法和漏洞分析技术(第3版)原书名: Gray Hat Hacking: The Ethical Hacker's Handbook, Third ...

  3. 深入java并发包源码(三)AQS独占方法源码分析

    深入java并发包源码(一)简介 深入java并发包源码(二)AQS的介绍与使用 深入java并发包源码(三)AQS独占方法源码分析 AQS 的实现原理 学完用 AQS 自定义一个锁以后,我们可以来看 ...

  4. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...

    本文告诉大家电脑显示器花屏怎么办呢,电脑显示器花屏解决方法和原因分析: 指电脑屏幕上有与常色不同的条纹,斑点或色块,或有位置颠倒.错乱,屏幕抖动.扭曲等情况. 显示器花屏是极其常见的故障,产生的原因有 ...

  5. yaahp层次分析法步骤_综合评价方法之层次分析法,选择再也难不倒你!

    在日常生活中, 我们常常面临着各种各样的选择. 比如你想去北京.上海.广州旅游, 但是由于种种原因, 你只能选择一个地点去旅游, 那么哪一种选择是最优的呢? 有没有较为科学的方法帮助我们更好地选择呢? ...

  6. java equals 判断空_Java 判断字符串是否为空的三种方法与性能分析

    [java中判断字符串是否为数字的三种方法  1>用JAVA自带的函数 public static boolean isNumeric(String str){   for (int i = s ...

  7. 降维后输入分类器分类时报错_逻辑回归解决多分类方法及其优缺点分析

    众所周知,逻辑回归常用于解决二分类任务,但是在工作/学习/项目中,我们也经常要解决多分类问题.本文总结了 3 种逻辑回归解决多分类的方法,并分析了他们的优缺点. 一.One-Vs-Rest 假设我们要 ...

  8. 放大电路分析方法、图解法分析放大电路

    放大电路分析方法.图解法分析放大电路 一.本文介绍的定义 二.放大电路分析方法 三.图解法 一.本文介绍的定义 放大电路分析.图解法.微变等效电路法.静态分析.动态分析.直流通路.交流通路.单管共射放 ...

  9. CSS、JavaScript和Ajax实现图片预加载的三大方法及优缺点分析

    预加载图片是提高用户体验的一个很好方法.图片预先加载到浏览器中,访问者便可顺利地在你的网站上冲浪,并享受到极快的加载速度.这对图片画 廊及图片占据很大比例的网站来说十分有利,它保证了图片快速.无缝地发 ...

最新文章

  1. 数字营销,带动汽车销量增长
  2. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.
  3. Core Animation简介
  4. Python 字符串操作方法大全
  5. 三星s窗口共享android,三星s窗口共享(SideSync pc端)
  6. 小米用户画像_腾讯企鹅智库发布手机品牌用户画像:华为一二线城市用户少于小米...
  7. unity 继承了 获取_为什么说Unity能用单纯脚本实现的功能,尽量避免继承MonoBehavior,保持纯粹性?...
  8. PyQt5 Pyinstaller时出现错误Cannot find PyQt5 plugin directories
  9. 输出正反等腰三角形(菱形)
  10. Unity3D(一) 操作界面及游戏常识
  11. andrioid 图像视频处理
  12. HFSS - 侧馈矩形微带天线设计与仿真
  13. android 4.4.2海信电视,ROOT海信电视Android4.0的详细步骤
  14. 华图教育计算机,计算机vf考试考什么
  15. 我奋斗了十八年不是为了和你一起喝杯咖啡
  16. STM32L476应用开发之七:流量的PID控制
  17. HTML做一个节日页面【六一儿童节】纯HTML代码
  18. 身在国外,除了克服语言障碍,还得背好99乘法表
  19. 天线开路短路检测原理_LEA-5S的天线开路检测问题
  20. 开源究竟有什么魅力?听完这 4 个故事你也许会明白

热门文章

  1. #三、经典股市理论与博弈论、随机性的前世今生、恩怨情仇 (一)、经典理论与博弈论的划分
  2. go是面向对象语言吗?
  3. 解决网页无法复制粘贴(生活小妙招)
  4. EL和JSTL表达式
  5. 知道创宇将参展2016年国家网络安全宣传周
  6. 交互系统函数$test$plusargs()与$value$plusargs ——字符串函数 $sformatf()与$sformat()的区别与用法
  7. 基于Android社区养老服务信息平台
  8. 深入解析WPF编程(奋斗的小鸟)_PDF 电子书
  9. 1恢复 群晖raid_群晖SHR、RAID1阵列模式拆分、降级为BASIC教程
  10. Cherry-Pick、Squash Commits、Rebase使用