手把手教你用MySQLExplain分析执行计划,轻松优化SQL查询
想提升MySQL查询性能却无从下手?本文手把手教你使用`EXPLAIN`命令,它是MySQL的“X光机”,能透视SQL查询的执行计划,帮你找出潜在瓶颈。通过分析`id`、`select_type`、`type`、`possible_keys`、`key`、`rows`和`Extra`等关键列,你可以了解MySQL如何访问表、使用索引,以及是否存在全表扫描、文件排序或临时表等问题。文章还提供了优化策略,包括避免全表扫描、利用覆盖索引、优化连接操作等。此外,还介绍了慢查询日志的配置和分析,结合`EXPLAIN`命令,让你能更有效地优化MySQL数据库性能,提升网站或应用的响应速度。
MySQL的EXPLAIN语句是优化查询性能的关键工具,通过在SELECT语句前添加EXPLAIN关键字,可获取查询执行计划并分析性能瓶颈。1. id列显示查询标识符,数值越大优先级越高;2. select_type表示查询类型,如SIMPLE、PRIMARY、SUBQUERY等;3. type列反映访问类型,从最优到最差依次为system、const、eq_ref、ref、fulltext、ref_or_null、index_merge、unique_subquery、index_subquery、range、index、ALL,应尽量避免ALL;4. possible_keys和key分别表示可能使用和实际使用的索引;5. rows列显示MySQL估计扫描的行数,值越小越好;6. Extra列包含额外信息,如Using index(覆盖索引)、Using where、Using temporary、Using filesort等,应避免filesort和temporary;7. 优化策略包括避免全表扫描、减少filesort、利用覆盖索引、优化连接操作、避免临时表、合理使用索引等。此外,慢查询日志可通过配置开启,并使用mysqldumpslow或pt-query-digest工具分析,结合EXPLAIN进一步优化查询性能。
MySQL的EXPLAIN
语句是优化查询性能的关键工具。它能让你洞悉MySQL如何执行你的SQL查询,从而找出潜在的瓶颈并进行优化。简单来说,EXPLAIN
就是SQL的X光机,帮你透视查询内部。

解决方案

要使用EXPLAIN
,只需在你的SELECT
语句前加上EXPLAIN
关键字即可。例如:

EXPLAIN SELECT * FROM users WHERE age > 25 AND city = 'New York';
执行这条语句后,MySQL会返回一个结果集,其中包含了关于查询执行计划的各种信息。接下来,我们需要解读这些信息,找到优化的切入点。
理解EXPLAIN
结果的关键列
id
: 查询的标识符。如果查询包含子查询或UNION,则会有多个id
。数值越大,优先级越高,越先执行。select_type
: 查询的类型。常见的类型包括:SIMPLE
: 简单查询,不包含子查询或UNION。PRIMARY
: 最外层的SELECT查询。SUBQUERY
: 子查询。DERIVED
: 在FROM子句中的子查询。UNION
: UNION语句中的第二个或后面的SELECT查询。UNION RESULT
: UNION的结果。
table
: 查询访问的表名。partitions
: 查询涉及到的分区。type
: 访问类型,表示MySQL如何查找表中的行。这是EXPLAIN
结果中最重要的一列,因为它反映了查询的效率。常见的类型包括(从最佳到最差):system
: 表中只有一行记录,通常是系统表。const
: 使用唯一索引或主键,只返回一行记录。eq_ref
: 使用唯一索引或主键,关联查询时只返回一行记录。ref
: 使用非唯一索引,返回匹配某个单独值的所有行。fulltext
: 使用全文索引。ref_or_null
: 类似于ref
,但是MySQL必须在初次查找的结果里找出null条目。index_merge
: 使用多个索引合并来查找行。unique_subquery
: 在IN
子查询中使用唯一索引。index_subquery
: 在IN
子查询中使用非唯一索引。range
: 在索引上进行范围查找,例如BETWEEN
、>
、<
。index
: 全索引扫描,扫描整个索引树。ALL
: 全表扫描,扫描整个表。应该尽量避免ALL
类型。
possible_keys
: MySQL可能使用的索引。key
: MySQL实际使用的索引。如果为NULL,表示没有使用索引。key_len
: 索引的长度,表示MySQL使用的索引的字节数。ref
: 显示索引的哪一列被使用了,通常是一个常量值。rows
: MySQL估计需要扫描的行数。这个值越小越好。filtered
: 表示经过WHERE条件过滤后剩余的百分比。Extra
: 包含关于MySQL如何执行查询的额外信息。一些常见的Extra
值包括:Using index
: 使用覆盖索引,不需要回表查询。Using where
: 使用WHERE子句过滤结果。Using temporary
: 使用临时表来存储中间结果,通常发生在ORDER BY
或GROUP BY
语句中。Using filesort
: 使用文件排序,而不是索引排序,通常性能较差。Using join buffer (Block Nested Loop)
: 使用连接缓冲区,通常发生在没有索引的连接操作中。Impossible WHERE noticed after reading const tables
: WHERE子句总是false,导致没有查到数据。Select tables optimized away
: 使用某些聚合函数(例如MIN
或MAX
)来访问仅仅使用索引的表时能被优化。
如何根据EXPLAIN
结果进行优化
- 避免全表扫描 (
type = ALL
): 这是最常见的优化目标。通过添加合适的索引,可以避免全表扫描。 - 优化
filesort
:filesort
通常表示性能瓶颈。可以尝试添加索引来避免文件排序。确保ORDER BY
子句中的列包含在索引中。 - 减少扫描的行数 (
rows
): 扫描的行数越多,查询效率越低。可以通过优化查询条件、使用更合适的索引来减少扫描的行数。 - 利用覆盖索引 (
Using index
): 覆盖索引是指索引包含了查询所需的所有列,不需要回表查询。可以显著提高查询性能。 - 优化连接操作: 确保连接操作使用的列有索引。避免使用没有索引的连接操作,这会导致
Using join buffer
。 - 避免使用临时表 (
Using temporary
): 临时表会增加查询的开销。可以尝试优化查询语句或添加索引来避免使用临时表。 - 分析
WHERE
子句: 确保WHERE
子句中的条件能够充分利用索引。避免在WHERE
子句中使用函数或表达式,这可能会导致索引失效。
MySQL的索引类型有哪些?它们有什么区别?
MySQL支持多种索引类型,不同的索引类型适用于不同的场景。常见的索引类型包括:
- B-Tree 索引: 这是MySQL中最常用的索引类型。B-Tree 索引适用于全值匹配、范围查询、前缀匹配等场景。它可以用于
=
、>
、<
、BETWEEN
、LIKE
等操作符。 - Hash 索引: Hash 索引使用哈希函数将索引列的值映射到一个哈希码,然后将哈希码存储在索引中。Hash 索引只适用于精确匹配 (
=
),不支持范围查询。Memory 存储引擎默认使用 Hash 索引。 - Fulltext 索引: Fulltext 索引用于全文搜索,可以查找包含指定关键词的文本。Fulltext 索引适用于
MATCH AGAINST
操作符。 - 空间索引 (R-Tree): 空间索引用于存储空间数据,例如地理位置信息。空间索引适用于空间查询,例如查找附近的地点。
- 聚簇索引 (Clustered Index): 聚簇索引决定了表中数据的物理存储顺序。InnoDB 存储引擎使用聚簇索引。如果没有显式定义主键,InnoDB会选择一个唯一的非空索引作为聚簇索引,如果不存在这样的索引,InnoDB会隐式创建一个自增的聚簇索引。
- 二级索引 (Secondary Index): 也称为非聚簇索引。二级索引存储索引列的值以及指向聚簇索引的指针。当查询使用二级索引时,MySQL首先在二级索引中查找匹配的行,然后根据指针回表查询聚簇索引中的数据。
B-Tree 索引是最通用的索引类型,适用于大多数场景。Hash 索引适用于精确匹配,但不支持范围查询。Fulltext 索引适用于全文搜索。空间索引适用于空间数据。聚簇索引决定了数据的物理存储顺序,二级索引用于辅助查询。选择合适的索引类型可以显著提高查询性能。
怎样处理慢查询日志?
MySQL的慢查询日志记录了执行时间超过long_query_time
秒的SQL查询。分析慢查询日志可以帮助你找到需要优化的查询。
开启慢查询日志: 在MySQL配置文件 (例如
my.cnf
或my.ini
) 中,设置以下参数:slow_query_log = 1 slow_query_log_file = /path/to/slow_query.log long_query_time = 2 log_output = FILE
slow_query_log
: 开启慢查询日志。slow_query_log_file
: 指定慢查询日志文件的路径。long_query_time
: 设置慢查询的阈值,单位为秒。log_output
: 指定日志输出方式,可以设置为FILE
或TABLE
。
重启MySQL服务使配置生效。
分析慢查询日志: 可以使用
mysqldumpslow
工具来分析慢查询日志。例如:mysqldumpslow -s t -t 10 /path/to/slow_query.log
-s t
: 按照查询时间排序。-t 10
: 显示前10个慢查询。
mysqldumpslow
可以帮助你找到执行时间最长的查询、出现频率最高的查询等。使用
pt-query-digest
:pt-query-digest
是 Percona Toolkit 中的一个工具,可以更详细地分析慢查询日志。它可以提供更全面的查询统计信息,例如查询的平均执行时间、最大执行时间、查询次数、查询使用的索引等。pt-query-digest /path/to/slow_query.log
优化慢查询: 根据慢查询日志的分析结果,找到需要优化的查询。使用
EXPLAIN
分析查询的执行计划,找出性能瓶颈,并进行优化。可以尝试添加索引、优化查询语句、重写SQL等方式来提高查询性能。
处理慢查询日志是一个持续的过程。定期分析慢查询日志,并对慢查询进行优化,可以有效地提高MySQL数据库的性能。
今天关于《手把手教你用MySQLExplain分析执行计划,轻松优化SQL查询》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql,索引,explain,性能优化,慢查询日志的内容请关注golang学习网公众号!

- 上一篇
- 打印机显示脱机?超简单几步轻松搞定,亲测有效!

- 下一篇
- uni-app实战!手把手教你搞定下拉刷新&上拉加载
-
- 数据库 · MySQL | 49分钟前 |
- MySQL主外键这样用!手把手教你搞定关联关系(超详细教程)
- 456浏览 收藏
-
- 数据库 · MySQL | 59分钟前 |
- MySQLLIKE查询太慢?优化技巧大放送
- 211浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL实战教学:增删改查经典案例详解
- 458浏览 收藏
-
- 数据库 · MySQL | 1小时前 |
- MySQL增删改查太复杂?超全语法速查表助你轻松掌握!
- 455浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL中as关键字怎么用?手把手教你给字段起别名
- 485浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL数据恢复不求人!超全技巧+神器工具分享
- 322浏览 收藏
-
- 数据库 · MySQL | 2小时前 |
- MySQL中英文乱码?这一招帮你快速修复
- 383浏览 收藏
-
- 数据库 · MySQL | 3小时前 |
- MySQLOrderBy太慢?优化排序性能就用这招!
- 245浏览 收藏
-
- 数据库 · MySQL | 4小时前 |
- MySQL缓存配置详解!查询缓存真实效果大揭秘
- 126浏览 收藏
-
- 数据库 · MySQL | 5小时前 | mysql 时区设置 时区转换 CONVERT_TZ java.time
- MySQL时间玩转教程:CONVERT_TZ函数+时区设置超详细解析
- 109浏览 收藏
-
- 数据库 · MySQL | 5小时前 |
- MySQL新手速成!基础概念+核心操作全掌握
- 301浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 97次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 105次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 111次使用
-
- 稿定PPT
- 告别PPT制作难题!稿定PPT提供海量模板、AI智能生成、在线协作,助您轻松制作专业演示文稿。职场办公、教育学习、企业服务全覆盖,降本增效,释放创意!
- 102次使用
-
- Suno苏诺中文版
- 探索Suno苏诺中文版,一款颠覆传统音乐创作的AI平台。无需专业技能,轻松创作个性化音乐。智能词曲生成、风格迁移、海量音效,释放您的音乐灵感!
- 102次使用
-
- MySQL主从切换的超详细步骤
- 2023-01-01 501浏览
-
- Mysql-普通索引的 change buffer
- 2023-01-25 501浏览
-
- MySQL高级进阶sql语句总结大全
- 2022-12-31 501浏览
-
- Mysql报错:message from server: * is blocked because of many
- 2023-02-24 501浏览
-
- 腾讯云大佬亲码“redis深度笔记”,不讲一句废话,全是精华
- 2023-02-22 501浏览