MySQL中EXPLAIN关键字详解

昨天领导突然问到,MySQL中explain获取到的type字段中index和ref的区别是什么。
这两种状态都是在使用索引后产生的,但具体区别却了解不多,只知道ref相比于index效率更高。
因此,本文较为详细地记录了MySQL性能中返回字段的含义、状态级别的产生条件与区别。

索引

假设有一个表 employees,包含以下字段:idfirst_namelast_nameaddress

  1. 普通索引 (Normal Index):这是最基本的索引类型,它没有任何限制。可以对表中的一个或多个字段创建普通索引,以加快数据查询的速度。
  • 示例
    CREATE INDEX idx_last_name ON employees (last_name);
    
  1. 唯一索引 (Unique Index):该索引与普通索引类似,不同之处在于索引列中的值必须唯一,但允许有空值(NULL)。如果在列中插入重复值,MySQL 会报错。
  • 示例
    CREATE UNIQUE INDEX idx_unique_first_name ON employees (first_name);
    
  1. 主键索引 (Primary Key Index):主键索引是一种特殊的唯一索引,不允许空值(NULL)。一个表只能有一个主键索引,一般用于标识表中的唯一记录。
  • 示例
    ALTER TABLE employees ADD PRIMARY KEY (id);
    
  1. 全文索引 (Full-text Index):用于全文搜索的索引,主要用于 CHAR、VARCHAR 和 TEXT 类型的字段。它可以加快对大文本数据的搜索速度,适用于需要进行全文检索的场景。
  • 示例
    CREATE FULLTEXT INDEX idx_fulltext_address ON employees (address);
    
  1. 组合索引 (Composite Index):组合索引是对表中的多个列创建的索引,用于提高多列条件查询的性能。MySQL 会根据组合索引中列的顺序来优化查询。
  • 示例
    CREATE INDEX idx_name ON employees (first_name, last_name);
    
  1. 空间索引 (Spatial Index):这是 MySQL 特有的索引类型,用于空间数据类型(如 POINT、LINESTRING、POLYGON 等)的索引。主要用于地理空间查询。
  • 示例
    CREATE SPATIAL INDEX idx_geometry ON locations (geometry);
    

关键字

EXPLAIN 是 MySQL 中的一个关键字,用于分析 SQL 查询语句的执行计划。通过 EXPLAIN 返回的信息,用户可以了解查询优化器是如何选择执行计划的,以及可能的性能瓶颈。

  1. id

    • 每个查询的唯一标识符。对于多表查询,id的值会增大。
  2. select_type

    • 查询的类型,主要有以下几种:
      • SIMPLE: 简单查询,不包含子查询或UNION。
      • PRIMARY: 最外层的SELECT。
      • SUBQUERY: 子查询中的第一个SELECT。
      • DERIVED: 派生表中的SELECT,比如在FROM子句中包含子查询。
      • UNION: UNION中的第二个或后续的SELECT。
      • UNION RESULT: UNION的结果集。
  3. table

    • 当前查询的表。
  4. partitions

    • 匹配的分区信息(如果有分区)。
  5. type

    • 表连接类型,显示查询中使用的连接类型,主要有以下几种,从优到劣排列:
      • system: 表只有一行(系统表)。
      • const: 表最多有一个匹配行,用于主键或唯一索引。
      • eq_ref: 对每个来自前一个表的行组合,从该表读取一行。
      • ref: 对于每个来自前一个表的行组合,从该表读取所有匹配的行。
      • range: 检索给定范围的行,使用索引来选择行。
      • index: 扫描整个索引。
      • ALL: 扫描整个表。
  6. possible_keys

    • 查询中可能使用的索引。
  7. key

    • 查询中实际使用的索引。
  8. key_len

    • 使用的索引的长度。
  9. ref

    • 显示哪一列或常量与key一起使用。
  10. rows

    • MySQL 估计要读取的行数。
  11. filtered

    • 经过WHERE条件过滤后,返回的行的百分比。
  12. Extra

    • 附加信息:
      • Using index: 表示使用了覆盖索引(只从索引中读取信息,不用回表)。
      • Using where: 使用了WHERE子句来过滤行。
      • Using temporary: 使用了临时表来保存中间结果。
      • Using filesort: MySQL使用外部排序而不是从表中按索引顺序读取行。

示例

以下是一个使用 EXPLAIN 的查询及其返回结果的示例:

EXPLAIN SELECT first_name, last_name FROM employees WHERE id = 1;

假设返回结果如下:

idselect_typetabletypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEemployeesconstPRIMARYPRIMARY4const1100.0Using index

解释:

  • id 是 1,表示这是一个简单查询。
  • select_typeSIMPLE,表示没有子查询。
  • tableemployees,查询的表是 employees
  • typeconst,表示使用了主键查询。
  • possible_keysPRIMARY,表示可能使用的索引是主键。
  • keyPRIMARY,实际使用的索引是主键。
  • key_len 是 4,表示索引的长度为 4 字节。
  • refconst,表示查询条件使用了常量。
  • rows 是 1,表示预期扫描1行。
  • filtered 是 100.0,表示返回的行没有被过滤。
  • ExtraUsing index,表示查询只使用了索引。

通过分析这些信息,用户可以优化查询,调整索引,提高查询性能。

type级别解释

EXPLAIN 语句的输出中,type 列表示 MySQL 在执行查询时使用的连接类型。不同的连接类型表示 MySQL 如何从表中选择数据。从性能优到劣排序:

  1. system

    • 表只有一行(系统表)。这是一个特殊的 const 连接类型,是性能最优的连接类型。
  2. const

    • 表最多有一个匹配行,用于主键或唯一索引。因为只有一行匹配,MySQL 可以将该值视为常量。对于 PRIMARY KEYUNIQUE 索引字段进行等值查询时,会使用这种类型。
    EXPLAIN SELECT * FROM employees WHERE id = 1;
    
  3. eq_ref

    • 对每个来自前一个表的行组合,从该表读取一行。这是性能次优的连接类型,用于使用唯一索引的所有部分进行等值比较的情况。通常用于带有主键或唯一索引的连接。
    EXPLAIN SELECT * FROM employees e JOIN departments d ON e.department_id = d.id;
    
  4. ref

    • 对于每个来自前一个表的行组合,从该表读取所有匹配的行。这种类型用于非唯一索引或非主键的情况。
    EXPLAIN SELECT * FROM employees WHERE department_id = 1;
    
  5. range

    • 检索给定范围的行,使用索引来选择行。常用于范围查询,如使用 <, <=, >, >=, BETWEEN, IN 等操作符的查询。
    EXPLAIN SELECT * FROM employees WHERE id BETWEEN 1 AND 10;
    
  6. index

    • 全索引扫描(Index Scan)。这种类型与 ALL 类似,但只遍历索引树。它比 ALL 更快,因为索引文件通常比数据文件小。
    EXPLAIN SELECT * FROM employees ORDER BY last_name;
    
  7. 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

  1. const

    EXPLAIN SELECT * FROM employees WHERE id = 1;
    
    • typeconst,因为 id 是主键,查询只会匹配一行。
  2. eq_ref

    EXPLAIN SELECT * FROM employees e JOIN departments d ON e.department_id = d.id;
    
    • typeeq_ref,因为 department_id 是一个索引,并且是连接条件的一部分。
  3. ref

    EXPLAIN SELECT * FROM employees WHERE department_id = 1;
    
    • typeref,因为 department_id 是一个非唯一索引。
  4. range

    EXPLAIN SELECT * FROM employees WHERE id BETWEEN 1 AND 10;
    
    • typerange,因为使用了范围查询。
  5. index

    EXPLAIN SELECT * FROM employees ORDER BY last_name;
    
    • typeindex,因为查询需要按照 last_name 进行排序,而没有其他过滤条件。
  6. ALL

    EXPLAIN SELECT * FROM employees WHERE first_name = 'John';
    
    • typeALL,因为 first_name 没有索引,需要全表扫描。

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

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

相关文章

使用Excel表格还是JSON数据来将数据存入Neo4的选择要素

在选择使用Excel表格还是JSON数据来将数据存入Neo4j时&#xff0c;需要考虑多个因素&#xff0c;包括数据的复杂性、规模、已有的数据处理工具以及你的个人或团队的熟悉度。以下是对两者的一些比较&#xff0c;帮助你做出选择&#xff1a; Excel表格 优点&#xff1a; 直观性…

Oracle(13)什么是外键(Foreign Key)?

外键&#xff08;Foreign Key&#xff09;是一个数据库表中的列或一组列&#xff0c;它们用于建立和强化两个表之间的链接和关系。外键指向另一个表的主键&#xff0c;用于确保数据的一致性和完整性。通过外键&#xff0c;可以保证一个表中的值必须来源于另一个表中的主键值。 …

【web】-反序列化-to_string

<?php highlight_file(__FILE__); class A{public $s;public function __destruct(){echo "hello".$this->s;}} class B{public $cmd;public function __toString(){system($this->cmd);return 1;} } unserialize($_GET[code]); __toString()当对象被当着…

探索特征的隐秘关系:在Scikit-Learn中进行特征交互性分析

探索特征的隐秘关系&#xff1a;在Scikit-Learn中进行特征交互性分析 在机器学习模型中&#xff0c;特征交互性分析是一种揭示特征之间相互作用对模型输出影响的技术。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中广泛使用的机器学习库&#xff…

【Linux服务器Java环境搭建】013 springboot + vue 前后端分离项目详细介绍(理论)

系列文章目录 【Linux服务器Java环境搭建】_一起来学吧的博客-CSDN博客 前言 在之前系列文章Linux服务器Java环境搭建 中&#xff0c;已经在CentOS中将所有环境及所需组件都安装完成了&#xff0c;比如git、jdk、nodejs、maven、mysql、clickhouse、redis、Nginx、rabbitMQ等…

《梦醒蝶飞:释放Excel函数与公式的力量》17.1使用命名范围和工作表函数

第17章&#xff1a;使用命名范围和工作表函数 17.1 命名范围的优势 在Excel中&#xff0c;使用命名范围是一个强大且灵活的功能&#xff0c;它可以极大地提高工作效率和公式的可读性。命名范围不仅使公式更容易理解&#xff0c;还减少了错误的可能性。以下将详细介绍命名范围的…

C++ STL equal_range 用法

一&#xff1a;功能 用于查找元素&#xff0c;它返回了 lower_bound, upper_bound 这两个函数查找结果值。 1. lower_bound 是返回第一个大于等于查找元素的位置。 2. upper_bound 是返回第一个大于查找元素的位置 二&#xff1a;用法 #include <vector> #include &l…

C++案例三:猜数字游戏

文章目录 介绍代码说明设置随机种子生成随机数猜测循环完整代码运行效果介绍 猜数字游戏是一个经典的编程练习,通过这个案例可以学习到基本的输入输出、随机数生成、条件判断和循环结构。 代码说明 设置随机种子 std::srand(static_cast<unsigned int>(std::time(nu…

自然语言大模型介绍

1 简介 最近一直被大语言模型刷屏。本文是周末技术分享会的提纲&#xff0c;总结了一些自然语言模型相关的重要技术&#xff0c;以及各个主流公司的研究方向和进展&#xff0c;和大家共同学习。 2 Transformer 目前的大模型基本都是Transformer及其变种。本部分将介绍Transf…

24暑假算法刷题 | Day18 | LeetCode 530. 二叉搜索树的最小绝对差,501. 二叉搜索树中的众数,236. 二叉树的最近公共祖先

目录 530. 二叉搜索树的最小绝对差题目描述题解 501. 二叉搜索树中的众数题目描述题解 236. 二叉树的最近公共祖先题目描述题解 530. 二叉搜索树的最小绝对差 点此跳转题目链接 题目描述 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

Python 更换 pip 源详细指南

目录 前言pip 国内源临时换源方法一&#xff1a;添加参数方法二&#xff1a;设置环境变量 永久换源方法三&#xff1a;修改配置方法四&#xff1a;pip 命令修改 总结 前言 在我们使用 Python 3 时&#xff0c;pip 是一个不可或缺的工具&#xff0c;它用于安装和管理第三方库。…

在虚拟机 CentOS7 环境下安装 MySQL5.7 数据库

配置目标 在虚拟机的 Linux CentOS7 环境下安装 MySQL5.7 版数据库&#xff0c;并能从宿主机 Windows 系统连接该数据库&#xff08;默认端口&#xff1a;3306&#xff09;。 1. 准备工作 WMware 虚拟机&#xff1a;VMware Workstation 16 ProCentOS7 镜像&#xff1a;CentO…

ubuntu 上安装软件

1.ubuntu 上安装火狐 在Ubuntu上安装Mozilla Firefox&#xff08;火狐浏览器&#xff09;通常很简单&#xff0c;你可以通过Ubuntu的软件包管理器来完成安装。以下是安装步骤&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 更新你的软件包列表&#xff0c;以确保你…

基于密钥的身份验证(Linux-Linux)

A主机&#xff1a; 1、生成密钥对 [rootservera ~]# ssh-keygen查看公钥 注&#xff1a;id_rsa为私钥&#xff08;证书&#xff09;&#xff0c;id_rsa.pub为公钥 2、注册公钥到服务器 [rootservera ~]# ssh-copy-id root172.25.250.106 查看.ssh 3、使用密钥连接服务器 #…

域名解析中断

在当今数字化的时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当域名解析中断时&#xff0c;整个网络世界仿佛瞬间陷入了混乱&#xff0c;给个人和企业带来诸多不便和损失。 域名解析&#xff0c;简单来说&#xff0c;就是将我们在浏览器中…

【yolov8】3、yolov8 环境安装 【GPU版】

pycharm下载安装 yolov8 环境安装 【GPU版】 1、要求1.1 什么是 CUDA 和 CUDNN1.2 查看cuda版本的3种方法&#xff08;版本在10.2以上的可以忽略本章节&#xff09;&#xff1a;1.3 没有找到NIVDIA图标&#xff0c;确认是否有英伟达显卡 2、pycharm下载安装进入官网 3、yolov8…

【Android】视图与常用控件总结

文章目录 一、视图基础1.1 设置视图的宽高1.2 设置视图的间距1.3 设置视图的对齐方式1.4 总结 二、控件2.1 TextView2.1.1 设置宽高2.1.2 设置内容2.1.3 设置大小2.1.4 设置颜色 2.2 Button2.3 EditText2.4 ImageView2.5 ProgressBar2.6 AlertDialog2.7 ProgressDialog 本文主要…

JAVASE进阶day14(网络编程续TCP,日志)

TCP 三次握手 四次挥手 package com.lu.day14.tcp;import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) {try(Socket socket new Socket("192.…

哈默纳科HarmonicDrive减速机组装注意事项

在机械行业中&#xff0c;精密传动设备HarmonicDrive减速机对于维持机械运作的稳定性和高效性起着至关重要的作用。然而在减速机的组装过程中&#xff0c;任何一个细微的错误都可能导致其运转时出现振动、异响等不良现象&#xff0c;严重时甚至可能影响整机的性能。因此&#x…

【开源库】libodb库编译及使用

前言 本文介绍windows平台下libodb库的编译及使用。 文末提供libodb-2.4.0编译好的msvc2019_64版本&#xff0c;可直接跳转自取 ODB库学习相关 【开源库学习】libodb库学习&#xff08;一&#xff09; 【开源库学习】libodb库学习&#xff08;二&#xff09; 【开源库学习】…