explain的type几种类型详解

简介: 在 MySQL 中,使用 EXPLAIN(或 EXPLAIN SELECT ...)可以查看 SQL 语句的执行计划,而其中最重要的字段之一就是 type。它表示 MySQL 在执行查询时访问数据表的方式(即访问类型),也叫做 连接类型(Join Type)。

在 MySQL 中,使用 EXPLAIN(或 EXPLAIN SELECT ...)可以查看 SQL 语句的执行计划,而其中最重要的字段之一就是 type。它表示 MySQL 在执行查询时访问数据表的方式(即访问类型),也叫做 连接类型(Join Type)。

这个字段的值越靠近 ALL(全表扫描),表示性能越差;越靠近 const 或 system,表示性能越好。

🔍 type 的所有类型按性能从好到差排序如下:

级别 类型 说明
🟢 非常优 system 表仅有一行(例如 system 表),非常快
🟢 非常优 const 表中最多只有一个匹配行,通常用于主键或唯一索引查询
🟢 非常优 eq_ref 唯一索引扫描,针对每个来自前表的记录,精确匹配一条记录
🟡 较优 ref 非唯一索引扫描,返回匹配某个索引列值的所有行
🟡 中等 fulltext 使用全文索引进行全文搜索
🟠 一般 ref_or_null 类似 ref,但还包含对 NULL 值的额外查找
🟠 一般 index_merge 多个索引合并使用,MySQL 取并集/交集
🟠 一般 unique_subquery 对于某些 IN 子查询优化为唯一索引查找
🟠 一般 index_subquery 类似于上一个,但返回多值
🔴 较差 range 索引范围扫描,查找某个范围内的记录,如 BETWEEN、<、>
🔴 较差 index 全索引扫描,遍历整个索引,避免回表但数据多时性能低
🔴 最差 ALL 全表扫描,没有用到索引,性能最差
📘 类型详解

  1. system

表只有一行,系统表。
非常快的情况,极少见。

  1. const

主键或唯一索引 + 常量查询,例如:SELECT * FROM users WHERE id = 1;
最多匹配一行,MySQL 在优化阶段即确定结果。

  1. eq_ref

针对连接操作中的子表,使用主键/唯一索引与外部表一对一匹配。SELECT * FROM orders o JOIN users u ON o.user_id = u.id;

  1. ref

使用非唯一索引查找,如普通索引字段的等值查询。SELECT * FROM users WHERE name = 'Alice';

  1. ref_or_null

查找索引匹配某值 或 NULL 的情况。SELECT * FROM users WHERE referrer_id = 10 OR referrer_id IS NULL;

  1. index_merge

多个索引联合使用(并集或交集)。SELECT * FROM users WHERE age = 20 OR city = 'Beijing';

  1. range

索引范围扫描,比如使用 <、BETWEEN、IN。SELECT * FROM users WHERE age BETWEEN 18 AND 30;

  1. index

扫描整个索引,但不扫表;常见于 ORDER BY、GROUP BY。SELECT age FROM users;

  1. ALL

全表扫描,没有使用索引,性能最差。SELECT * FROM users WHERE age + 1 = 20;
✅ 如何优化 type?

避免出现 ALL、index 类型。
加索引:为 WHERE、JOIN、ORDER BY 中用到的字段建立合适的索引。
使用覆盖索引:避免回表操作。
避免在 WHERE 条件中对字段进行函数或表达式运算。
使用合适的连接顺序(表小的、过滤多的放前面)。
https://www.52runoob.com/archives/5401

相关文章
|
存储 自然语言处理 关系型数据库
MySQL高级篇——索引的创建与设计原则
索引的分类与使用、MySQL8.0索引新特性、适合创建索引的情况、不适合创建索引的情况
MySQL高级篇——索引的创建与设计原则
|
4月前
|
存储 前端开发 JavaScript
深入探索WebGIS地图开发技术
随着互联网技术的不断发展,WebGIS(Web地理信息系统)逐渐成为地理信息展示与分析的重要工具。WebGIS 系统能够通过浏览器展示地图,并支持地图操作(如缩放、平移、查询等),因此在导航、城市规划、环境监测、公共安全等领域有着广泛应用。
|
消息中间件 数据库 RocketMQ
分布式事务常见解决方案
分布式事务常见解决方案
2536 0
|
消息中间件 存储 Java
最经典的消息中间件:RabbitMQ
最经典的消息中间件:RabbitMQ
1232 1
|
监控 Java 应用服务中间件
谈谈你对spring boot 3.0的理解
1. Java 版本要求:Spring Boot 3.0 要求使用 Java 17 或更高版本,这可能会对一些仍在使用旧版 Java 的项目造成兼容性问题。需要确保项目使用的 Java 版本符合要求,并考虑是否需要升级 JDK 版本。 2. 底层依赖项迁移:Spring Boot 3.0 将所有底层依赖项从 Java EE 迁移到了 Jakarta EE API,基于 Jakarta EE 9 并尽可能地兼容 Jakarta EE 10。这可能会对一些使用了 Java EE 的应用造成影响,需要进行相应的修改和调整。 3. 插件和库的支持:尽管 Spring Boot 3.0 支持更多的插件和
1283 0
|
开发工具 git
Git - Smart Checkout、Force Checkout 区别
Git - Smart Checkout、Force Checkout 区别
2086 0
Git - Smart Checkout、Force Checkout 区别
|
4月前
|
SQL 分布式计算 大数据
SparkSQL 入门指南:小白也能懂的大数据 SQL 处理神器
在大数据处理的领域,SparkSQL 是一种非常强大的工具,它可以让开发人员以 SQL 的方式处理和查询大规模数据集。SparkSQL 集成了 SQL 查询引擎和 Spark 的分布式计算引擎,使得我们可以在分布式环境下执行 SQL 查询,并能利用 Spark 的强大计算能力进行数据分析。
|
存储 自然语言处理 算法
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
ES高频面试问题:一张图带你读懂 Elasticsearch 中“正排索引(正向索引)”和“倒排索引(反向索引)”区别
|
12月前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
2452 10
|
Docker 容器
docker中检查容器的网络模式
【10月更文挑战第5天】
1245 1