手把手教你用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 | 9小时前 |
- MySQL数据库30条必学命令详解
- 280浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL安装配置教程手把手教学步骤
- 197浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL增删改查全攻略详解
- 412浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL分片方案与实现方法解析
- 318浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL安装配置教程手把手教你安装步骤
- 486浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL基础命令速查新手必学指南
- 129浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL数据库入门:核心概念与操作全解析
- 315浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- 主键外键关系解析与关联原理
- 157浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL常用存储引擎有哪些?InnoDB与MyISAM对比解析
- 174浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL创建数据库的详细步骤教程
- 283浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQLLIKE查询优化技巧分享
- 302浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL数据库30条必备管理命令
- 143浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 126次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 123次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 137次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 133次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 134次使用
-
- 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浏览