【explain执行计划】MySQL性能调优

news2024/11/15 21:55:31

explain是MySQL性能调优过程中必须掌握的工具,explain结果中常见的type结果及代表的含义,并且通过同一个SQL语句的性能差异,说明建立正确的索引多么重要。

explain结果中的type字段代表什么意思?

在这里插入图片描述
MySQL的官网解释非常简洁,只用了3个单词:连接类型(the join type)。它描述了找到所需数据使用的扫描方式。

最为常见的扫描方式有:

(1)system:系统表,少量数据,往往不需要进行磁盘IO; ---- 查询系统表

(2)const:常量连接; ---- 主键索引查询

(3)eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描; ---- 两表查询主键id作为条件

(4)ref:非主键非唯一索引等值扫描; ---- 两表查询普通索引作为条件

(5)range:范围扫描; ---- 索引上的范围查询,如id>10

(6)index:索引树扫描; ---- 索引上的全表扫描,如count(id)

(7)ALL:全表扫描(full table scan);

画外音:这些是最常见的,大家去explain自己工作中的SQL语句,95%都是上面这些类型。

上面各类扫描方式由快到慢: system > const > eq_ref > ref > range > index > ALL

下面一一举例说明。

一、system

explain select * from mysql.time_zone;
在这里插入图片描述

上例中,从系统库mysql的【系统表time_zone】里查询数据,扫码类型为system,这些数据已经加载到内存里,不需要进行磁盘IO。

这类扫描是速度最快的。

二、const

create table user (
   id int primary key,
   name varchar(20)
)engine=innodb;


insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');

explain select * from user where id=1;
在这里插入图片描述
const扫描的条件为:

(1)命中主键(primary key)或者唯一(unique)索引;

(2)被连接的部分是一个常量(const)值;

如上例,id是PK,连接部分是常量1。

画外音:这里注意,防止隐式类型转换。

这类扫描效率极高,返回数据量少,速度非常快。

三、eq_ref

数据准备:

create table user (
   id int primary key,
   name varchar(20)
)engine=innodb;

insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');

create table user_ex (
   id int primary key,
   age int
)engine=innodb;

insert into user_ex values(1,18);
insert into user_ex values(2,20);
insert into user_ex values(3,30);
insert into user_ex values(4,40);
insert into user_ex values(5,50);

explain select * from user, user_ex where user.id = user_ex.id;
在这里插入图片描述
eq_ref扫描的条件为,对于前表的每一行(row),后表只有一行被扫描。
如上例,id是主键,该join查询为eq_ref扫描。
这类扫描的速度也异常之快。

四、ref

普通索引查询时,可能有多行命中。速度还是很快的。

五、range

数据准备:

create table user (
  id int primary key,
  name varchar(20)
)engine=innodb;

insert into user values(1,'shenjian');
insert into user values(2,'zhangsan');
insert into user values(3,'lisi');
insert into user values(4,'wangwu');
insert into user values(5,'zhaoliu');

range扫描就比较好理解了,它是【索引上的范围查询】,它会在索引上扫描特定范围内的值。
例如:
explain select * from user where id in(1,2,3);
explain select * from user where id > 3;
画外音:查询条件必须是索引。

六、index

index类型,需要【扫描索引上的全部数据】。
explain count (*) from user;
如上例,id是主键,该count查询需要通过扫描索引上的全部数据来计数。

画外音:此表为InnoDB引擎。它仅比全表扫描快一点。

七、ALL

explain select * from user, user_ex where user.id = user_ex.id;
两表查询如果id条件上不建索引,对于前表的每一行(row),后表都要被全表扫描。

总结1

今天这篇文章中,这个相同的join语句出现了三次:

(1)扫描类型为eq_ref,此时id为主键(查询条件是主键ID);

(2)扫描类型为ref,此时id为非唯一普通索引(查询条件是非主键ID);

(3)扫描类型为ALL,全表扫描,此时id上无索引(查询条件不带索引);

总结2

(1)explain结果中的type字段,表示(广义)连接类型,它描述了找到所需数据使用的扫描方式;

(2)常见的扫描类型(由快到慢)有: system>const>eq_ref>ref>range>index>ALL

(3)各类扫描类型的要点是:

------------system最快:不进行磁盘IO

------------const:PK或者unique上的等值查询

------------eq_ref:PK或者unique上的join查询,等值匹配,对于前表的每一行(row),后表只有一行命中

------------ref:非唯一索引,等值匹配,可能有多行命中

------------range:索引上的范围扫描,例如:between/in/>

------------index:索引上的全集扫描,例如:InnoDB的count

------------ALL最慢:全表扫描(full table scan)

(4)建立正确的索引(index),非常重要;

(5)使用explain了解并优化执行计划,非常重要;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/73602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端埋点分析

第三方代码埋点 已经有很多成型的服务商了如友盟,百度统计等🌯,都提供了比较成型的方案🎨,并可以在后台管理系统中查看比较详细的数据分析 自己动手 优点: 控制精准,可以非常精确地选择什么时…

Bulma的简单使用

文章目录1. 引入Bulma2. 字体和颜色3. 间距和容器1. 引入Bulma 通过 CDN 引入&#xff1a; <style>import "https://cdnjs.cloudflare.com/ajax/libs/bulma/0.9.4/css/bulma.min.css";</style>官网还有其他多种引入方式。 2. 字体和颜色 在 Bulma 中&…

基于jQuery或Zepto的图片延迟加载插件

当我们网站的页面图片过多时&#xff0c;加载速度就会很慢。尤其是用手机2G/3G访问页面&#xff0c;不仅页面慢&#xff0c;而且还会用掉很多流量。我们主题之前也都采用了图片的懒加载形式&#xff0c;但都不完美&#xff0c;部分主题还采用了占位图片来控制懒加载&#xff0c…

CP2102N高度集成USB全速带电池充电检测控制芯片

目录CP2102N简介主要特点芯片特性CP2102N开发板开发板功能应用领域CP2102N简介 CP2102N是USBXpress系列中新的一款高度集成的USB转RS232的桥接芯片。不但较上一代CP210X系列更有成本效益&#xff0c;而且在功能上也有更多创新。其中&#xff0c;符合USB-BCS 1.2规范的充电器识…

【人脸识别】基于直方梯度图 HDGG 的人脸识别算法研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步进步&#xff0c;matlab项目目标合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信息&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算…

入门系列 - Git的管理修改与撤销修改

本篇文章&#xff0c;是基于我自用Linux系统中的自定义文件夹“test_rep”&#xff0c;当做示例演示 具体Git仓库的目录在&#xff1a;/usr/local/git/test_rep Git的管理修改与撤销修改 在讲这个之前&#xff0c;还是有必要再阐述一下“工作区和暂存区”。Git 和其它版本控制…

计算机毕业论文java毕业设计选题源代码S2SH校园BBS论坛系统

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH校园论坛_哔哩哔哩_bilibili计算机毕业设计java毕设之S2SH校园论坛共计2条视频&#xff0c;包括&#xff1a;计算机…

机器学习与数据挖掘——分类与预测模型

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;分类与预测 分类(Classification)&#xff1a;分类是找出描述并区分数据类或概念的分类函数或分类模型(也常常称作分类器)&#xff0c;该模型能把数据库中的数据项映射到给…

设计行业文档管理怎么做?天翎群晖全新解决方案来了!

编者按&#xff1a;解决设计行业文档管理难题&#xff0c;天翎群晖全新解决方案来帮忙&#xff01;本文分析了设计行也中的文档管理难点&#xff0c;并从五个方面介绍了天翎群晖是如何解决这些难题的。 关键词&#xff1a;免安装&#xff0c;免维护&#xff0c;私有化部署&…

ant design select 搜索同时支持输入和下拉选中

这个需求看着简单&#xff0c;但是实现起来走了不少弯路。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/74008ea8204c47e5b33ada2e82c56e26.png 1. 需求 当输入关键词时&#xff0c;远程搜索内容&#xff0c;有返回则下拉展示&#xff0c;无返回也要展示当前输入的关键…

学了C语言基本的语法,感觉转化代码的能力还是不强,编程能力到底该怎样提升?

刚开始学习编程的时候&#xff0c; 想写段不报错的代码吧&#xff0c;需要耗时十几分钟到一个小时。刷一道 Leetcode 上面的算法题呀&#xff0c;需要一个到几个小时。实现一个稍微复杂点的功能需求&#xff0c;跑通时间无比长。。。 当时&#xff0c;想一夜之前变成写代码的高…

ThreadLocal分析

每个线程都会有属于自己的本地内存&#xff0c;在堆中的变量在被线程使用的时候会被复制一个副本线程的本地内存中&#xff0c;当线程修改了共享变量之后就会通过JMM管理控制写会到主内存中。 很明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的…

瑞格尔侯爵葡萄酒之城大师班

11月28日&#xff0c;美夏国际酒业携手西班牙瑞格尔侯爵酒庄&#xff08;Marqus de Riscal&#xff09;在上海的“苏河江宴”举办了一系列瑞格尔侯爵明星产品的大师班品鉴会。 开场前&#xff0c;一杯清爽的瑞格尔侯爵酒园白葡萄酒&#xff08;Marqus de Riscal Rueda Verdejo …

大一学生HTML个人网页作业作品——火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

深度学习: BatchNormlization论文详细解读

《Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 论文详细解读&#x1f4a1;目录<center>《Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 论文详细解读基础知识面…

机器学习11支持向量机SVM(处理线性数据)

文章目录一、什么是支撑向量机&#xff1f;二、Hard Margin SVM思想逻辑推理点到直线的距离&#xff1a;推论&#xff1a;再推&#xff1a;换符号替代&#xff1a;最大化距离&#xff1a;三、Soft Margin SVM和SVM正则化Hard Margin SVM缺点&#xff1a;所以我们必须思考一个机…

YOLO v1

参考 YOLO v1 - 云社区 - 腾讯云 摘要 我们提出了一种新的目标检测方法YOLO。 先前的目标检测工作重新利用分类器来执行检测。 相反&#xff0c;我们将对象检测作为空间分离的边界框和相关类概率的回归问题。 在一次评估中&#xff0c;一个单一的神经网络直接从完整的图像预…

内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs

关于用户态的文件操作函数我们知道有open、read、write这些。但是这些的实现都是依赖于库的实现&#xff0c;但是在内核态是没有库函数可用的。最近做测试&#xff0c;在内核态中&#xff0c;需要学习一下在内核态里面的文件操作函数。分为三对出现。 感谢前辈的优秀文章&…

企业网站怎么建立?【企业网站的建设】

不少的实体企业都会考虑建立一个自己的企业网站&#xff0c;那么在企业网站的建设之前需要做好功课。那么企业网站怎么建立&#xff1f;下面给大家说说大概的流程。 1、申请域名 企业可以申请一个和自己企业名称相关的域名&#xff0c;而且域名尽量不要太长&#xff0c;否则难…

Java学习之多态数组

目录 一、定义 二、举例说明 要求1 父类-Person 子类-Student 子类-Teacher main类 运行结果 要求2 思路分析 main类中的代码 运行结果 一、定义 数组的定义类型为父类类型&#xff0c; 里面保存的实际元素类型为子类类型&#xff08;也可以有父类&#xff09; 二、…