深入理解 MySQL 查询分析工具 EXPLAIN 的使用

在线工具站
  • 推荐一个程序员在线工具站:程序员常用工具http://cxytools.com),有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具,效率加倍嘎嘎好用。
程序员资料站
小报童专栏精选Top100
  • 推荐一个小报童专栏导航站:小报童精选Top100http://xbt100.top),收录了生财有术项目精选、AI海外赚钱、纯银的产品分析等专栏,陆续会收录更多的专栏,欢迎体验~

在优化数据库性能时,理解和分析 SQL 查询的执行计划是至关重要的一步。

MySQL 提供了一个强大的工具------EXPLAIN,来帮助我们了解查询是如何执行的,以及识别潜在的性能瓶颈。

一、EXPLAIN 概述

EXPLAIN 语句用于显示 MySQL 如何执行 SELECT 语句。它会生成一个查询执行计划,详细说明每一步的执行过程,包括表的访问顺序、使用的索引、表之间的连接方式等。这些信息对于优化查询性能至关重要。

EXPLAIN 的基本语法

sql 复制代码
EXPLAIN [EXTENDED | PARTITIONS] SELECT select_options
  • EXTENDED:提供更多的执行计划信息,包括优化器重写查询的详细信息。
  • PARTITIONS:显示分区相关的信息。

二、EXPLAIN 的输出字段解析

EXPLAIN 的输出包含许多字段,每个字段提供不同的执行计划信息。以下是常见字段及其解释:

  1. id:查询中执行的每个子查询或联合查询的标识符。数值越大,优先级越高。
  2. select_type:查询的类型,如 SIMPLE(简单查询)、PRIMARY(主查询)、UNION(联合查询的一部分)、SUBQUERY(子查询)等。
  3. table:查询涉及的表。
  4. type :表的访问类型,表示 MySQL 如何查找行。常见类型包括:
    • ALL:全表扫描,性能最差。
    • index:遍历索引扫描。
    • range:索引范围扫描。
    • ref:非唯一索引扫描。
    • eq_ref:唯一索引扫描。
    • const/system:常量表访问。
  5. possible_keys:查询中可能使用的索引。
  6. key:实际使用的索引。
  7. key_len:使用的索引键长度。
  8. ref:索引的列或常量。
  9. rows:估计的扫描行数。
  10. filtered:表中满足条件的行百分比。
  11. Extra:附加信息,如 Using where、Using index、Using temporary、Using filesort 等。

三、使用 EXPLAIN 分析查询示例

让我们通过几个具体示例,来详细说明如何使用 EXPLAIN 分析查询。

示例一:全表扫描

sql 复制代码
EXPLAIN SELECT * FROM employees WHERE age > 30;

输出解释:

  • type : ALL,表示全表扫描。
  • possible_keys : NULL,没有可用的索引。
  • key : NULL,未使用索引。
  • rows : 10000,估计扫描 10000 行。

这种情况说明查询没有使用索引,可能会导致性能问题。可以考虑为 age 列添加索引。

示例二:使用索引

sql 复制代码
EXPLAIN SELECT * FROM employees WHERE age > 30 AND department_id = 1;

输出解释:

  • type : range,索引范围扫描。
  • possible_keys : idx_age_department
  • key : idx_age_department,实际使用了索引。
  • rows : 500,估计扫描 500 行。

在这个查询中,使用了复合索引 (age, department_id),显著减少了扫描的行数,提高了查询性能。

示例三:复杂查询

sql 复制代码
EXPLAIN SELECT e.name, d.name 
FROM employees e 
JOIN departments d ON e.department_id = d.id 
WHERE e.age > 30;

输出解释:

  • id: 1, 1
  • select_type : SIMPLE, SIMPLE
  • table : e, d
  • type : ref, eq_ref
  • possible_keys : idx_department_id, PRIMARY
  • key : idx_department_id, PRIMARY
  • rows : 500, 1

这里可以看到,查询涉及两个表的连接,MySQL 使用了 refeq_ref 类型的索引扫描,优化了连接查询的性能。

四、优化查询性能的建议

通过 EXPLAIN 分析查询执行计划后,我们可以采取一些优化措施来提高查询性能:

  1. 创建适当的索引:根据查询条件,创建合适的单列或复合索引。
  2. 避免全表扫描 :尽量使用索引,以避免 ALL 类型的全表扫描。
  3. 优化连接查询:确保连接列上有索引,以提高连接查询的效率。
  4. 使用覆盖索引:在查询中选择使用覆盖索引,减少表的访问次数。
  5. 避免不必要的列:只选择需要的列,减少 I/O 开销。

五、进阶:使用 EXPLAIN EXTENDED

EXPLAIN EXTENDED 提供了更多关于查询优化的信息。它不仅显示执行计划,还显示查询优化器如何重写查询。

sql 复制代码
EXPLAIN EXTENDED SELECT * FROM employees WHERE age > 30;
SHOW WARNINGS;

在执行 SHOW WARNINGS 后,我们可以看到优化器对查询进行了哪些调整。

六、总结

MySQL 的 EXPLAIN 工具是优化 SQL 查询性能的利器。通过理解和分析查询的执行计划,我们可以识别潜在的性能瓶颈,并采取相应的优化措施。

无论是添加索引、调整查询结构,还是优化连接方式,EXPLAIN 都提供了关键性的指导信息。

相关推荐
Wang's Blog4 分钟前
Redis: 集群环境搭建,集群状态检查,分析主从日志,查看集群信息
数据库·redis
容器( ु⁎ᴗ_ᴗ⁎)ु.。oO24 分钟前
MySQL事务
数据库·mysql
数据龙傲天1 小时前
1688商品API接口:电商数据自动化的新引擎
java·大数据·sql·mysql
engineer-gxd2 小时前
MySQL 表的操作
mysql
cyt涛2 小时前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
Rookie也要加油3 小时前
01_SQLite
数据库·sqlite
liuxin334455663 小时前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。3 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec4 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa4 小时前
【MySQL 09】表的内外连接
数据库·mysql