5分钟看SQL的执行计划

一、概述

​ 如果你想优化SQL语句,那么SQL执行计划就是必须要知道的,因为只有通过SQL的执行计划,你才可以知道SQL是如何进行查询的,以及否走索引、用的是什么索引、是否进行了排序又是如何排序的等等信息。

​ 在应用层面其实就是在SQL语句前面加上Explain,我在前面的文章中有涉及到这个的使用,但是没有细说,今天我们专门来讲一讲这个Explain输出的信息都是什么意思

二、Explain输出的列

意义
id SELECT标识符
select_type SELECT类型
table 输出行的表
partitions 匹配的分区
type 联接类型
possible_keys 可供选择的可能索引
key 实际选择的索引
key_len 所选密钥的长度
ref 与索引比较的列
rows 要检查的行的估计
filtered 按表条件过滤的行百分比
Extra 附加信息

举例

这里为了大家能够理解,我举一个例子:

第二列的select_type,这里的SIMPLE表示简单查询,也就是说没有使用UNION或者子查询

第四列的type很重要,可以通过这个判断SQL的执行速度以及是否使用索引和使用的是什么索引

第五列的possible_keys顾名思义,也就是对于此次查询可供选择的key

第六列的key就是真正使用的索引,在这个例子中使用的是PRIMARY主键索引

第七列的key_len也就是使用的键的长度

第八列的ref表示的是和索引比较的列是如何使用索引的(因为一个查询的where条件中可能使用到多个索引)

三、根据type分析使用的索引

type列最常见的值有如下几种:

  • const

    使用PRIMARY KEYUNIQUE索引,通俗的说就是使用了唯一索引(获取到的是单行数据),这个算是最快的了

  • ref

    要比const慢一些,使用的不是唯一索引(获取到的可能有多行数据),比如仅仅使用了键的最左前缀键或者普通索引

    例子:

可以通过row这一列看到,查询出来了2条数据

  • ref or null

    与ref有点类似,不一样的是MySQL会额外去搜索有NULL值的行

    例子:

在使用普通索引的时候还加上了 IS NULL 这一条件

注意:普通索引的这个字段在设计表结构的时候没有设置IS NOT NULL

  • index

    这个表示只是遍历了二级索引,也就是没有进行回表查询,就是之前文章说过的索引覆盖

注:如果使用二级索引进行全表扫描

  • range

    这个很简单,其实就是范围查询

  • all

    这个其实没什么好说的,其实就是全表扫描,是最慢的那一种

四、小结

  • range

    这个很简单,其实就是范围查询

  • all

    这个其实没什么好说的,其实就是全表扫描,是最慢的那一种

四、小结

​ 其实对于我们优化SQL,尤其是查询语句,其实最核心的就是希望尽可能的使用到索引,尽可能少的全表扫描,为了知道SQL是否使用到了索引,我们需要去查看执行计划,,因此本篇文章才会特别关心type列输出的内容。通过Explain观察SQL的执行计划,去设计适合业务需求的索引。

MySQL进阶之路(二十)—— 5分钟看懂SQL的执行计划相关推荐

  1. Docker最全教程之MySQL容器化 (二十四)

    Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四) 前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过 ...

  2. 零基础带你学习MySQL—unique 唯一(二十五)

    零基础带你学习MySQL-unique 唯一(二十五) unqiue 使用细节 如果没有指定 not null 则 unique 字段可以有多个 null 如果一个列(字段) 是 unique not ...

  3. Android进阶知识(二十五):Bitmap简介及其高效加载

    Android进阶知识(二十五):Bitmap简介及其高效加载 一.Bitmap   Bitmap代表一个位图,在Android中指的是一张图片,可以是png.jpg等格式的图片.BitmapDraw ...

  4. ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14(ES进阶之路二)

    简介 JavaScript是世界上发展最快的编程语言之一,不仅可以用于编写运行在浏览器的客户端程序,随着Node.js的发展,JavaScript也被广泛应用于编写服务端程序.而随着JavaScrip ...

  5. Mysql进阶学习(二)条件查询

    Mysql进阶学习(二)条件查询 进阶2:条件查询 一.按条件表达式筛选 案例1:查询工资>12000的员工信息 案例2:查询部门编号不等于90号的员工名和部门编号 二.按逻辑表达式筛选 案例1 ...

  6. 六级考研单词之路-二十

    title: 六级考研单词之路-二十 date: 2020-12-07 12:07:45 tags: 六级考研单词之路 Day20 1.chemistry[n.化学] eg: She chose to ...

  7. 六级考研单词之路-二十八

    title: 六级考研单词之路-二十八 date: 2020-12-17 12:29:40 tags: 六级考研单词之路 Day28 1.up[adv.向上] eg: Put the packet u ...

  8. Ubuntu 服务器开机后二十多分钟远程连接自动断掉(自动挂起)

    0x00 问题描述 近日实验室新进了一批服务器,有幸分到了一台3090的.安装nvidia驱动后重启了一下,刚开始还正常能用,过了二十来分钟,远程桌面连接自动断掉了,ssh连接也连接不上,Ping I ...

  9. 六级考研单词之路-二十六

    title: 六级考研单词之路-二十六 date: 2020-12-15 16:43:28 tags: 六级考研单词之路 Day26 1.big[adj.大的] 2.bloody[n.流血的,血腥的] ...

最新文章

  1. flask中使用FileField上传文件的两种方式+前端页面上传文件(flask三种上传文件方式)
  2. vue 移动端签字_Vue 移动端
  3. 68页PPT,读懂中、美、德三国智能制造战略!
  4. Bit-Z转入GXS、PPS、SPHTX、EOS未到账解决方案
  5. Intellij Idea的使用之svn篇
  6. matlab仿真二元等幅边射阵,MATLAB仿真天线阵代码.doc
  7. iOS开发多线程篇—NSOperation基本操作
  8. 解决在servlet中输出html的中文输出为问号的问题
  9. 如何利用百度音乐播放器的API接口来获取高音质歌曲
  10. Python实现四个经典小游戏合集
  11. 用计算机改手机电量,三分钟更换iPhone 6虚标电池,老手机又焕发青春了
  12. crio电压采集 labview_LabVIEW与cRIO入门.pdf
  13. awgn信道matlab,AWGN信道下数字通信系统的蒙特卡洛仿真(基于matlab).doc
  14. SQL Server数据库应用与开发教程各章习题参考答案
  15. 9大代理服务器软件的比较与分析
  16. 6月30日 区块链新闻
  17. python如何下载安装spacy_Python spaCy
  18. [Vuforia]二.3D物体识别
  19. matlab 稀疏随机矩阵,Matlab 稀疏矩阵函数
  20. 「 OFFICE 」将Excel的sheet拆分成独立文件的方法

热门文章

  1. 我原本以为学会Excel走天下,想不到Python这么牛?
  2. pb 窗体最大化最小化触发事件
  3. Couple number
  4. jQuery实现的上下滚动公告栏
  5. 为什么你成不了「超级个体」?
  6. 清华大学(向勇老师)的笔记摘录
  7. java deque,Java Deque接口
  8. css 相对定位取消占位,css position 相对定位
  9. 生产者消费者问题-代码详解(Java多线程)
  10. 数字形式转换——python123