MySQL:MySQL的EXPLAIN各字段含义详解

2024-06-05 05:04

本文主要是介绍MySQL:MySQL的EXPLAIN各字段含义详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在MySQL中,EXPLAIN是一个强大的工具,用于获取关于SELECT语句执行计划的信息。当你对查询性能有疑问时,使用EXPLAIN可以帮助你理解MySQL如何执行你的查询,并可能揭示性能瓶颈。

以下是EXPLAIN输出中各个列的详细解释:

一、 id

  1.查询的标识符。每个SELECT都有一个唯一的标识符。

  2.如果查询中有子查询,那么这个ID可以显示子查询的顺序。

二、select_type

查询的类型

常见的值有:

  1.SIMPLE:简单的SELECT,不包含子查询或UNION

  2.PRIMARY:查询中最外层的SELECT

  3.UNION、DEPENDENT UNION:内层查询依赖于外层查询的结果集

  4.UNION RESULT:UNION的结果集

  5.SUBQUERY:子查询中的第一个SELECT

三、table

  1.输出结果集的表。

  2.如果查询涉及多个表,则此列表示MySQL决定按哪个表的顺序来连接它们。

四、type

连接类型

这是非常重要的列,因为它显示了MySQL决定如何连接表

常见的值有:

  1.system:表只有一行,等于const

  2.const:表最多有一个匹配行

  3.eq_ref:所有部分都使用了唯一索引或主键

  4.ref:非唯一索引或唯一索引的非唯一前缀

  5.fulltext:使用全文索引

  6.ref_or_null:与ref类似,但增加了对NULL值的搜索

  7.index_merge:表示使用了索引合并优化方法

  8.unique_subquery:用于IN子查询,以确保子查询返回唯一值

  9.index_subquery:与unique_subquery类似,但可能返回非唯一值

  10.range:对索引进行范围查找

  11.index:全索引扫描,比全表扫描稍快

  12.ALL:全表扫描

五、possible_keys

显示可能应用在这张表中的索引。注意是可能,但不一定真的会用到。

  1.key:实际使用的索引。如果为NULL,则没有使用索引。

  2.key_len:使用的索引的长度。在不使用全部索引列的情况下,可以为你提供实际使用的索引部分的信息。

  3.ref:显示哪些列或常量被用作索引查找上的参考点。

  4.rows:MySQL估计必须检查的行数来找到相关的行。注意这是一个估计值。

  5.filtered:表示返回结果的行数占需要检查的行数的百分比。

六. Extra

包含不适合在其他列中显示的额外信息。

  1.Using filesort:MySQL需要对结果进行排序,这通常意味着没有可用的索引来完成排序操作,因此可能导致性能下降。

  2.Using temporary:表示MySQL需要使用临时表来保存查询结果,这可能会增加I/O操作并降低性能。

  3.Using index:表示查询只需要访问索引,而无需访问数据行。这通常意味着查询会更快。

  4.Using where:表示使用了WHERE子句来过滤结果。

  5.Using join buffer:表示使用了连接缓冲区来辅助连接操作。

代码示例

EXPLAIN SELECT *  from users
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |  
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+  
|  1 | SIMPLE      | users | NULL       | ref  | idx_name      | idx_name | 767    | const|    1 |   100.00 | Using where |  
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+

  在这个示例中,type 是 ref,表示 MySQL 使用了非唯一索引或唯一索引的非唯一前缀来连接表。possible_keys 和 key 列都显示了 idx_name 索引被使用。rows 列为 1,表示 MySQL 估计只需检查 1 行就能找到匹配的行。Extra 列中的 Using where 表示 MySQL 使用了 WHERE 子句来过滤结果。

七、优化建议

1.type = ALL (全表扫描)
  建议:添加适当的索引,尤其是WHERE子句、JOIN条件和ORDER BY子句中涉及的列。

2.type = index (全索引扫描)
  建议:如果查询只需要索引中的部分信息而不是整行数据,考虑使用COVERING INDEX(覆盖索引),即索引包含了查询所需的所有数据。

3.rows列的值非常大
建议:检查WHERE子句是否足够严格以限制返回的行数。考虑添加或修改索引以减少需要检查的行数。

4.key_len列的值非常大
  建议:如果key_len的值很大,可能是因为索引包含了较大的列(如VARCHAR(255))或复合索引中有很多列。考虑使用更小的数据类型或更少的索引列。

5.possible_keys列有值但key列为NULL
  建议:即使MySQL识别到可能有用的索引,但由于某些原因(如索引不是最优选择、统计信息不准确等)它没有使用。考虑重新评估索引策略或更新统计信息。

6.Extra = Using filesort
  建议:如果排序是必需的,考虑添加复合索引,将ORDER BY子句中的列作为索引的一部分。如果可能,避免在查询中混合使用ASC和DESC排序。

7.Extra = Using temporary
  建议:对于涉及GROUP BY、DISTINCT或UNION等操作的查询,确保使用了合适的索引。考虑重写查询以减少临时表的使用

这篇关于MySQL:MySQL的EXPLAIN各字段含义详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032140

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Python MySQL如何通过Binlog获取变更记录恢复数据

《PythonMySQL如何通过Binlog获取变更记录恢复数据》本文介绍了如何使用Python和pymysqlreplication库通过MySQL的二进制日志(Binlog)获取数据库的变更记录... 目录python mysql通过Binlog获取变更记录恢复数据1.安装pymysqlreplicat

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st