一文详解数据库中如何使用explain分析SQL执行计划

 更新时间:2025年06月26日 10:33:50   作者:五道书童  
Explain是SQL分析工具中非常重要的一个功能,它可以模拟优化器执行查询语句,帮助我们理解查询是如何执行的,这篇文章主要介绍了数据库中如何使用explain分析SQL执行计划的相关资料,需要的朋友可以参考下

前言

EXPLAIN 是分析 SQL 查询性能的关键工具,能帮助你理解查询的执行计划,并优化查询性能。以下是一份详细的数据库 EXPLAIN 使用教程,适用于常见的数据库系统(如 MySQL、PostgreSQL 等)

1. 什么是 EXPLAIN?

EXPLAIN 是一个数据库命令,用于显示 SQL 查询的执行计划(即数据库如何执行你的查询)。通过分析输出结果,你可以:

  • 确定查询是否使用了索引。
  • 发现全表扫描等低效操作。
  • 优化 JOIN 顺序或子查询。
  • 估算查询的代价(如扫描的行数)。

2. 基本语法

MySQL

EXPLAIN [FORMAT=JSON|TREE|TRADITIONAL] SELECT ...;
-- 示例
EXPLAIN SELECT * FROM users WHERE age > 30;

PostgreSQL

EXPLAIN [ANALYZE] [VERBOSE] SELECT ...;
-- 示例
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;
  • ANALYZE:实际执行查询并显示详细统计信息。
  • VERBOSE:显示额外的信息(如列名)。

3. EXPLAIN 输出列详解(MySQL)

以下是一个典型的 EXPLAIN 输出结果及字段解释:

列名说明
id查询的标识符(多表 JOIN 时,相同 id 表示同一执行层级)。
select_type查询类型(如 SIMPLE, PRIMARY, SUBQUERY, DERIVED 等)。
table访问的表名。
partitions匹配的分区(如果表有分区)。
type关键字段:访问类型(性能从优到差排序:system > const > eq_ref > ref > range > index > ALL)。
possible_keys可能使用的索引。
key实际使用的索引。
key_len使用的索引长度(字节数)。
ref与索引比较的列或常量。
rows关键字段:预估需要扫描的行数。
filtered过滤后剩余行的百分比(MySQL 特有)。
Extra关键字段:附加信息(如 Using where, Using index, Using temporary 等)。

4. 关键字段解析与优化思路

type 列

  • const:通过主键或唯一索引查询,最多返回一行(最优)。
  • eq_ref:JOIN 时使用主键或唯一索引。
  • ref:使用非唯一索引查找。
  • range:索引范围扫描(如 BETWEEN, >)。
  • index:全索引扫描(比全表扫描稍好)。
  • ALL:全表扫描(需优化,考虑添加索引)。

Extra 列

  • Using where:服务器在存储引擎检索后再次过滤。
  • Using index:查询仅通过索引完成(覆盖索引)。
  • Using temporary:使用了临时表(常见于排序或分组)。
  • Using filesort:需要额外排序(考虑添加索引优化排序)。

rows 列

  • 数值越小越好,表示预估扫描的行数。

5. 实战示例

示例表结构

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    INDEX idx_age (age)
);

查询 1:未使用索引

EXPLAIN SELECT * FROM users WHERE name = 'Alice';

输出分析:

  • type: ALL(全表扫描)
  • possible_keys: NULL(无可用索引)
  • 优化建议:为 name 列添加索引。

查询 2:使用索引

EXPLAIN SELECT * FROM users WHERE age = 25;

输出分析:

  • type: ref
  • key: idx_age
  • rows: 1(高效查询)

6. PostgreSQL 的 EXPLAIN 差异

  • 输出格式:更详细,包含实际执行时间(需使用 EXPLAIN ANALYZE)。
  • 关键信息
    • Seq Scan:全表扫描。
    • Index Scan:索引扫描。
    • Hash Join / Nested Loop:JOIN 类型。
  • 示例:
    EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;
    

7. 常见问题与优化建议

问题 1:全表扫描(type=ALL)

  • 优化方法:为 WHERE 条件或 JOIN 字段添加索引。

问题 2:临时表(Using temporary)

  • 优化方法:优化 GROUP BY / ORDER BY 子句,确保使用索引。

问题 3:文件排序(Using filesort)

  • 优化方法:为 ORDER BY 字段添加索引。

问题 4:索引未生效

  • 可能原因:数据类型不匹配、函数操作(如 WHERE YEAR(date) = 2023)。
  • 优化方法:避免在索引列上使用函数。

总结

通过 EXPLAIN 分析 SQL 执行计划,可以快速定位性能瓶颈。重点关注 typerowsExtra 列,优先优化全表扫描、临时表和文件排序等问题。不同数据库的 EXPLAIN 输出略有差异,但核心思路一致。

到此这篇关于数据库中如何使用explain分析SQL执行计划的文章就介绍到这了,更多相关explain分析SQL执行计划内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • postgresql 常用SQL语句小结

    postgresql 常用SQL语句小结

    postgresql使用过程中常用到的一些sql语句,方便我们快速使用查询一些操作特整理一下,方便需要的朋友
    2022-11-11
  • PostgreSQL的generate_series()函数的用法说明

    PostgreSQL的generate_series()函数的用法说明

    这篇文章主要介绍了PostgreSQL的generate_series()函数的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL数据库中跨库访问解决方案

    PostgreSQL数据库中跨库访问解决方案

    这篇文章主要介绍了PostgreSQL数据库中跨库访问解决方案,需要的朋友可以参考下
    2017-05-05
  • Windows上PostgreSQL安装配置教程

    Windows上PostgreSQL安装配置教程

    这篇文章主要为大家详细介绍了Windows上PostgreSQL安装配置教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 如何查看postgres数据库端口

    如何查看postgres数据库端口

    这篇文章主要介绍了如何查看postgres数据库端口操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL 实现将多行合并转为列

    PostgreSQL 实现将多行合并转为列

    这篇文章主要介绍了PostgreSQL 实现将多行合并转为列的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • PostgreSQL向量检索之pgvector入门实战指南

    PostgreSQL向量检索之pgvector入门实战指南

    pgvector是PostgreSQL的开源扩展,用于在数据库中存储和处理向量数据,特别是高维嵌入向量(embedding),本文介绍PostgreSQL向量检索:pgvector入门指南,感兴趣的朋友一起看看吧
    2026-01-01
  • PostgreSQL 复制表的 5 种方式详解

    PostgreSQL 复制表的 5 种方式详解

    PostgreSQL 提供了多种不同的复制表的方法,它们的差异在于是否需要复制表结构或者数据,这篇文章主要介绍了PostgreSQL 复制表的 5 种方式,需要的朋友可以参考下
    2023-01-01
  • 在postgreSQL中运行sql脚本和pg_restore命令方式

    在postgreSQL中运行sql脚本和pg_restore命令方式

    这篇文章主要介绍了在postgreSQL中运行sql脚本和pg_restore命令方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL避免索引失效的十大实用技巧

    PostgreSQL避免索引失效的十大实用技巧

    在现代应用开发中,PostgreSQL 作为一款功能强大、开源且高度可扩展的关系型数据库,被广泛应用于各种业务场景,然而,即使拥有优秀的索引设计,如果使用不当,依然会导致索引失效,本文将深入探讨 避免 PostgreSQL 索引失效的十大实用技巧,需要的朋友可以参考下
    2026-03-03

最新评论