MySQL中EXPLAIN关键字详解
昨天领导突然问到,MySQL中explain获取到的type字段中index和ref的区别是什么。
这两种状态都是在使用索引后产生的,但具体区别却了解不多,只知道ref相比于index效率更高。
因此,本文较为详细地记录了MySQL性能中返回字段的含义、状态级别的产生条件与区别。
索引
假设有一个表 employees,包含以下字段:id、first_name、last_name 和 address。
- 普通索引 (Normal Index):这是最基本的索引类型,它没有任何限制。可以对表中的一个或多个字段创建普通索引,以加快数据查询的速度。
- 示例CREATE INDEX idx_last_name ON employees (last_name);
- 唯一索引 (Unique Index):该索引与普通索引类似,不同之处在于索引列中的值必须唯一,但允许有空值(NULL)。如果在列中插入重复值,MySQL 会报错。
- 示例CREATE UNIQUE INDEX idx_unique_first_name ON employees (first_name);
- 主键索引 (Primary Key Index):主键索引是一种特殊的唯一索引,不允许空值(NULL)。一个表只能有一个主键索引,一般用于标识表中的唯一记录。
- 示例ALTER TABLE employees ADD PRIMARY KEY (id);
- 全文索引 (Full-text Index):用于全文搜索的索引,主要用于 CHAR、VARCHAR 和 TEXT 类型的字段。它可以加快对大文本数据的搜索速度,适用于需要进行全文检索的场景。
- 示例CREATE FULLTEXT INDEX idx_fulltext_address ON employees (address);
- 组合索引 (Composite Index):组合索引是对表中的多个列创建的索引,用于提高多列条件查询的性能。MySQL 会根据组合索引中列的顺序来优化查询。
- 示例CREATE INDEX idx_name ON employees (first_name, last_name);
- 空间索引 (Spatial Index):这是 MySQL 特有的索引类型,用于空间数据类型(如 POINT、LINESTRING、POLYGON 等)的索引。主要用于地理空间查询。
- 示例CREATE SPATIAL INDEX idx_geometry ON locations (geometry);
关键字
EXPLAIN 是 MySQL 中的一个关键字,用于分析 SQL 查询语句的执行计划。通过 EXPLAIN 返回的信息,用户可以了解查询优化器是如何选择执行计划的,以及可能的性能瓶颈。
-  id - 每个查询的唯一标识符。对于多表查询,id的值会增大。
 
-  select_type - 查询的类型,主要有以下几种: - SIMPLE: 简单查询,不包含子查询或UNION。
- PRIMARY: 最外层的SELECT。
- SUBQUERY: 子查询中的第一个SELECT。
- DERIVED: 派生表中的SELECT,比如在FROM子句中包含子查询。
- UNION: UNION中的第二个或后续的SELECT。
- UNION RESULT: UNION的结果集。
 
 
- 查询的类型,主要有以下几种: 
-  table - 当前查询的表。
 
-  partitions - 匹配的分区信息(如果有分区)。
 
-  type - 表连接类型,显示查询中使用的连接类型,主要有以下几种,从优到劣排列: - system: 表只有一行(系统表)。
- const: 表最多有一个匹配行,用于主键或唯一索引。
- eq_ref: 对每个来自前一个表的行组合,从该表读取一行。
- ref: 对于每个来自前一个表的行组合,从该表读取所有匹配的行。
- range: 检索给定范围的行,使用索引来选择行。
- index: 扫描整个索引。
- ALL: 扫描整个表。
 
 
- 表连接类型,显示查询中使用的连接类型,主要有以下几种,从优到劣排列: 
-  possible_keys - 查询中可能使用的索引。
 
-  key - 查询中实际使用的索引。
 
-  key_len - 使用的索引的长度。
 
-  ref - 显示哪一列或常量与key一起使用。
 
-  rows - MySQL 估计要读取的行数。
 
-  filtered - 经过WHERE条件过滤后,返回的行的百分比。
 
-  Extra - 附加信息: - Using index: 表示使用了覆盖索引(只从索引中读取信息,不用回表)。
- Using where: 使用了WHERE子句来过滤行。
- Using temporary: 使用了临时表来保存中间结果。
- Using filesort: MySQL使用外部排序而不是从表中按索引顺序读取行。
 
 
- 附加信息: 
示例
以下是一个使用 EXPLAIN 的查询及其返回结果的示例:
EXPLAIN SELECT first_name, last_name FROM employees WHERE id = 1;
假设返回结果如下:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | 
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | employees | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.0 | Using index | 
解释:
- id是 1,表示这是一个简单查询。
- select_type是- SIMPLE,表示没有子查询。
- table是- employees,查询的表是- employees。
- type是- const,表示使用了主键查询。
- possible_keys是- PRIMARY,表示可能使用的索引是主键。
- key是- PRIMARY,实际使用的索引是主键。
- key_len是 4,表示索引的长度为 4 字节。
- ref是- const,表示查询条件使用了常量。
- rows是 1,表示预期扫描1行。
- filtered是 100.0,表示返回的行没有被过滤。
- Extra是- Using index,表示查询只使用了索引。
通过分析这些信息,用户可以优化查询,调整索引,提高查询性能。
type级别解释
在 EXPLAIN 语句的输出中,type 列表示 MySQL 在执行查询时使用的连接类型。不同的连接类型表示 MySQL 如何从表中选择数据。从性能优到劣排序:
-  system - 表只有一行(系统表)。这是一个特殊的 const连接类型,是性能最优的连接类型。
 
- 表只有一行(系统表)。这是一个特殊的 
-  const - 表最多有一个匹配行,用于主键或唯一索引。因为只有一行匹配,MySQL 可以将该值视为常量。对于 PRIMARY KEY或UNIQUE索引字段进行等值查询时,会使用这种类型。
 EXPLAIN SELECT * FROM employees WHERE id = 1;
- 表最多有一个匹配行,用于主键或唯一索引。因为只有一行匹配,MySQL 可以将该值视为常量。对于 
-  eq_ref - 对每个来自前一个表的行组合,从该表读取一行。这是性能次优的连接类型,用于使用唯一索引的所有部分进行等值比较的情况。通常用于带有主键或唯一索引的连接。
 EXPLAIN SELECT * FROM employees e JOIN departments d ON e.department_id = d.id;
-  ref - 对于每个来自前一个表的行组合,从该表读取所有匹配的行。这种类型用于非唯一索引或非主键的情况。
 EXPLAIN SELECT * FROM employees WHERE department_id = 1;
-  range - 检索给定范围的行,使用索引来选择行。常用于范围查询,如使用 <,<=,>,>=,BETWEEN,IN等操作符的查询。
 EXPLAIN SELECT * FROM employees WHERE id BETWEEN 1 AND 10;
- 检索给定范围的行,使用索引来选择行。常用于范围查询,如使用 
-  index - 全索引扫描(Index Scan)。这种类型与 ALL类似,但只遍历索引树。它比ALL更快,因为索引文件通常比数据文件小。
 EXPLAIN SELECT * FROM employees ORDER BY last_name;
- 全索引扫描(Index Scan)。这种类型与 
-  ALL - 全表扫描(Table Scan)。这是性能最差的连接类型。MySQL 必须扫描整个表才能找到匹配的行。通常这是由于查询没有使用索引,或者优化器认为全表扫描比使用索引更快。
 EXPLAIN SELECT * FROM employees WHERE first_name = 'John';
示例及详细解释
假设有一个表 employees,表结构如下:
CREATE TABLE employees (id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,INDEX (department_id)
);
使用不同查询进行 EXPLAIN:
-  const EXPLAIN SELECT * FROM employees WHERE id = 1;- type是- const,因为- id是主键,查询只会匹配一行。
 
-  eq_ref EXPLAIN SELECT * FROM employees e JOIN departments d ON e.department_id = d.id;- type是- eq_ref,因为- department_id是一个索引,并且是连接条件的一部分。
 
-  ref EXPLAIN SELECT * FROM employees WHERE department_id = 1;- type是- ref,因为- department_id是一个非唯一索引。
 
-  range EXPLAIN SELECT * FROM employees WHERE id BETWEEN 1 AND 10;- type是- range,因为使用了范围查询。
 
-  index EXPLAIN SELECT * FROM employees ORDER BY last_name;- type是- index,因为查询需要按照- last_name进行排序,而没有其他过滤条件。
 
-  ALL EXPLAIN SELECT * FROM employees WHERE first_name = 'John';- type是- ALL,因为- first_name没有索引,需要全表扫描。
 
相关文章:
MySQL中EXPLAIN关键字详解
昨天领导突然问到,MySQL中explain获取到的type字段中index和ref的区别是什么。 这两种状态都是在使用索引后产生的,但具体区别却了解不多,只知道ref相比于index效率更高。 因此,本文较为详细地记录了MySQL性能中返回字段的含义、状…...
如何理解ref toRef和toRefs
是什么 ref 生成值类型的响应式数据可用于模板和reactive通过.value修改值 ref也可以像vue2中的ref那样使用 toRef 针对一个响应式对象(reactive)的prop创建一个ref两者保持引用关系 toRefs 将响应式对象(reactive封装)转换…...
【linux】kernel-trace
文章目录 linux kernel trace配置trace内核配置trace接口使用通用配置Events配置Function配置Function graph配置Stack trace设置 跟踪器tracer功能描述 使用示例1.irqsoff2.preemptoff3.preemptirqsoff linux kernel trace 配置 源码路径: kernel/trace trace内…...
【Golang 面试基础题】每日 5 题(一)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
ETCD介绍以及Go语言中使用ETCD详解
ETCD介绍以及Go语言中使用ETCD详解 什么是etcd ETCD是一个分布式、可靠的key-value存储的分布式系统,用于存储分布式系统中的关键数据;当然,它不仅仅用于存储,还提供配置共享及服务发现;基于Go语言实现 。 etcd的特点 完全复制:集群中的每个节点都可以使用完整的存档高…...
 
03-用户画像+Elasticsearch
优点 es支持海量数据的写入和更新es可以和hadoop,hive及spark进行集成es支持hivesql的操作,可以通过hivesql将数据导入eses的在进行数据检索查询是速度比较快es是分布式存储 应用 全文检索 全文检索流程: 1-对文档数据(文本数据)进行分词 2-将分词…...
 
初学Mybatis之搭建项目环境
在连接 mysql 数据库时,遇到了个 bug,之前都能连上,但报错说换了个 OS 操作系统什么的 然后搜索怎么连接,找到了解决方法 MySQL MYSQL – 无法连接到本地MYSQL服务器 (10061)|极客教程 (geek-docs.com) 命令行输入 services.msc…...
 
JMeter使用小功能-(持续更新)
1、jmeter在同一个线程组内,uuid的复用 方式一: 方式二: 2、获得jMeter使用的线程总数 ctx.getThreadGroup().getNumberOfThreads()来表示活动线程总数 int threadNumctx.getThreadGroup().getNumThreads(); String threads Integer…...
科研绘图系列:R语言火山图(volcano plot)
介绍 火山图(Volcano Plot),也称为火山图分析,是一种在生物信息学和基因组学中常用的图形表示方法,主要用于展示基因表达数据的差异。它通常用于基因表达微阵列或RNA测序数据的可视化,帮助研究人员识别在不同条件下表达差异显著的基因。 火山图的基本构成 X轴:通常表示…...
 
docker firewalld 防火墙设置
1、环境 centos 7 firewalld docker-ce docker 默认会更改防护墙配置 导致添加的防火墙策略不生效,可以启用firewalld 重新设置策略 2、启用防火墙 systemctl start firewalld systemctl enable firewalld3、配置文件禁用docker 的iptables /etc/docker/daemon.js…...
 
《问题004:报错-JS问题-unknown: Invalid shorthand property initializer.》
问题描述: unknown: Invalid shorthand property initializer. (25:13) unknown:无效的简写属性初始化项 解决方法: “”应该写为“:”(globalData 改成 globalData: )...
什么是 MLPerf?
什么是 MLPerf? MLPerf 是一个用于衡量机器学习硬件、软件和服务性能的标准化基准测试平台。它由 MLCommons 组织开发,该组织是由多家领先的科技公司和学术机构组成的。MLPerf 的目标是通过一系列标准化的基准测试任务和数据集,提供一个统一…...
【SpringBoot】第3章 SpringBoot的系统配置
3.1 系统配置文件 3.1.1 application.properties SpringBoot支持两种不同格式的配置文件,一种是Properties,一种是YML。 SpringBoot默认使用application.properties作为系统配置文件,项目创建成功后会默认在resources目录下生成applicatio…...
 
ELK日志分析系统部署文档
一、ELK说明 ELK是Elasticsearch(ES) Logstash Kibana 这三个开源工具组成,官方网站: The Elastic Search AI Platform — Drive real-time insights | Elastic 简单的ELK架构 ES: 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它…...
 
ue5笔记
1 点光源 聚光源 矩形光源 参数比较好理解 (窗口里面)环境光混合器:快速创造关于环境光的组件 大气光源:太阳光,定向光源 天空大气:蓝色的天空和大气 高度雾:大气下面的高度感的雾气 体积…...
 
TCP重传机制详解
1.什么是TCP重传机制 在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回⼀个确认应答消息,表示已收到消息。 但是如果传输的过程中,数据包丢失了,就会使⽤重传机制来解决。TCP的重传机制是为了保证数据传输的…...
如何使用javascript将商品添加到购物车?
使用JavaScript将商品添加到购物车可以通过以下步骤实现: 创建一个购物车对象,可以是一个数组或者对象,用于存储添加的商品信息。在网页中的商品列表或详情页面,为每个商品添加一个“添加到购物车”的按钮,并为按钮绑…...
 
【MySQL】:想学好数据库,不知道这些还想咋学
客户端—服务器 客户端是一个“客户端—服务器”结构的程序 C(client)—S(server) 客户端和服务器是两个独立的程序,这两个程序之间通过“网络”进行通信(相当于是两种角色) 客户端 主动发起网…...
1.关于linux的命令
1.关于文件安装的问题 镜像站点服务器:cat /etc/apt/sources.list 索引文件:cd /var/lib/apt/lists 下载文件包存在的路径:cd /etc/cache/apt/archives/2.关于dpkg文件安装管理器的应用: 安装文件:sudo dpkg -i 文件名; 查找文件目录:sudo …...
 
【人工智能】机器学习 -- 决策树(乳腺肿瘤数)
目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序dtree.py,熟悉sklearn机器实习开源库。 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用决策树对breast-cancer-wisconsin.data进行分类。 …...
 
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
 
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
 
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
 
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
 
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
 
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
 
9-Oracle 23 ai Vector Search 特性 知识准备
很多小伙伴是不是参加了 免费认证课程(限时至2025/5/15) Oracle AI Vector Search 1Z0-184-25考试,都顺利拿到certified了没。 各行各业的AI 大模型的到来,传统的数据库中的SQL还能不能打,结构化和非结构的话数据如何和…...
