深入理解 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 都提供了关键性的指导信息。

相关推荐
南城花随雪。12 分钟前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了13 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度14 分钟前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮17 分钟前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9991 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
武子康2 小时前
大数据-231 离线数仓 - DWS 层、ADS 层的创建 Hive 执行脚本
java·大数据·数据仓库·hive·hadoop·mysql
黑色叉腰丶大魔王2 小时前
《MySQL 数据库备份与恢复》
mysql
苏-言2 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring