当前位置: 首页 > news >正文

小d课堂mysql_mysql之explain详解(分析索引的最佳使用)

在这里对explain的各个字段进行详细的分析,来帮助大家分析自己所写的sql是否最佳的使用了索引。

1b2b56d3c501b45ffbac72a09f1cbd60.png

首先是select_type:将select查询分为简单(simple)和复杂两种类型

复杂类型又分为子查询(subquery)和from列表中包含子查询(drived)

simple:

a52632f609da034b0c099379386cdff3.pngdrived:

6abf16f3b99920b67cae8a7427e3a736.png

就type进行详细的介绍:

System,const,eq_ref,ref,range,index,all

all : 即全表扫描

cbc712cd11dbcbce172591a586797853.png

index : 按索引次序扫描,先读索引,再读实际的行,结果还是全表扫描,主要优点是避免了排序。因为索引是排好的。

range:以范围的形式扫描。

explain select * from a where a_id > 1\G

ref:非唯一索引访问(只有普通索引)

create table a(a_id int not null, key(a_id));

insert into a values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

mysql> explain select * from a where a_id=1\G

1be0ba8ba62c870eac348a33e8e4fc13.png

eq_ref:使用唯一索引查找(主键或唯一索引)

const:常量查询

在整个查询过程中这个表最多只会有一条匹配的行,比如主键 id=1 就肯定只有一行,只需读取一次表数据便能取得所需的结果,且表数据在分解执行计划时读取。

9c546ac615cc3a336883fe3d7ec615e5.png当结果不是一条时,就会变成index或range等其他类型

system:系统查询

null:优化过程中就已经得到结果,不在访问表或索引

possible_keys:可能用到的索引

key:实际用到的索引

key_line:索引字段最大可能使用长度

ref:

指出对 key 列所选择的索引的查找方式,常见的值有 const, func, NULL, 具体字段名。当 key 列为 NULL ,即不使用索引时,此值也相应的为 NULL 。

119ffb3e0f563f8d9c3272da8d2d0ef8.png

rows:估计需要扫描的行数

Extra:显示以上信息之外的其他信息

Using index

此查询使用了覆盖索引(Covering Index),即通过索引就能返回结果,无需访问表。

若没显示"Using index"表示读取了表数据。

Using where

表示 MySQL 服务器从存储引擎收到行后再进行“后过滤”(Post-filter)。所谓“后过滤”,就是先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。因为检查是在读取行后才进行的,所以称为“后过滤”。

ff9817f342f64dea854eba6e9c86b47b.png

Using temporary

使用到临时表

建表及插入数据:

create table a(a_id int, b_id int);

insert into a values(1,1),(1,1),(2,1),(2,2),(3,1);

mysql> explain select distinct a_id from a\G        Extra: Using temporary

MySQL 使用临时表来实现 distinct 操作。

Using filesort

若查询所需的排序与使用的索引的排序一致,因为索引是已排序的,因此按索引的顺序读取结果返回,否则,在取得结果后,还需要按查询所需的顺序对结果进行排序,这时就会出现 Using filesort 。

select * from a order by id;

对于没有索引的列进行order by 就会出现filesort

相关文章:

  • LINUX 批量删除文件的几种方法
  • mysql 模糊 不包括_Oracle 模糊查询中不包括某字符串的实现方式
  • star 序列比对2020-12-25
  • java线程模式_Java多线程基础(十一)——Future模式
  • RNA-seq实战--2小时
  • java什么是数组_JAVA中数组是什么?
  • ChIP-seq数据处理流程(附赠长达5小时的视频指导)
  • java录制视频_java 屏幕录制
  • java 双线性插值算法_双线性插值
  • 查看当前linux系统位数
  • java 获取存储过程异常_oracle存储过程获取异常信息码和异常信息
  • java char utf 16_为什么Java char使用UTF-16?
  • ls用法大全
  • mv移动文件夹
  • js java map_JS实现 java的Map
  • 《Java编程思想》读书笔记-对象导论
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【React系列】如何构建React应用程序
  • 2017 年终总结 —— 在路上
  • CSS 专业技巧
  • Java读取Properties文件的六种方法
  • Js基础知识(一) - 变量
  • PAT A1050
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue UI框架库开发介绍
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 简单易用的leetcode开发测试工具(npm)
  • 容器服务kubernetes弹性伸缩高级用法
  • 使用 QuickBI 搭建酷炫可视化分析
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 王永庆:技术创新改变教育未来
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ionic入门之数据绑定显示-1
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (zt)最盛行的警世狂言(爆笑)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计ssm电影分享网站
  • (转)大型网站架构演变和知识体系
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等
  • .NET : 在VS2008中计算代码度量值
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 通过 Ef Core 操作 Mysql