小索引大力量,记一次explain的性能优化经历

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 本文介绍了在MySQL生产环境中使用EXPLAIN工具进行性能优化的过程。通过分析慢查询日志,识别出性能瓶颈,并利用EXPLAIN命令解析SQL执行计划,找出全表扫描、未使用索引等问题。文章还详细描述了如何配置慢查询日志、解读EXPLAIN输出的关键字段(如type、key、rows等),并提供了优化建议,如避免左右模糊查询、减少多表联查等。最终验证优化效果,确保系统性能提升。此外,强调了项目初期建立索引的重要性,以应对未来数据量增长带来的挑战。

添加图片注释,不超过 140 字(可选)


在 MySQL 的生产环境中,性能问题是一个常见的挑战。当数据库查询响应时间变慢,或者系统资源消耗异常时,我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN,它可以帮助我们分析查询语句的执行计划,从而找到性能瓶颈。

本文模拟之前生产环境mysql性能问题的优化过程,对生产环境的复盘。系统上线后正常使用,大概1年后就出现业务慢,运维反馈某些业务操作会让服务器cpu飙升到100%以上。


添加图片注释,不超过 140 字(可选)


准备

理解 EXPLAIN 输出

EXPLAIN 命令可以附加在任何 SQL 查询语句之前,用于显示 MySQL 如何执行该查询。输出结果包含多个字段,每个字段都提供了关于查询执行的重要信息。

以下是 EXPLAIN 输出中的一些关键字段:

  • id:查询标识符,表示查询中操作的顺序。
  • select_type:查询的类型,如 SIMPLE、SUBQUERY、DERIVED 等。
  • table:查询涉及的表。
  • type:访问类型,如 ALL、index、range、ref 等,反映了 MySQL 查找行的方式。
  • possible_keys:可能用到的索引。
  • key:实际使用的索引。
  • key_len:使用的索引长度。
  • ref:显示索引的哪一列被使用了。
  • rows:MySQL 认为必须检查的用来返回请求数据的行数。
  • Extra:包含不适合在其他列中显示但十分重要的额外信息。
  • filtered:表示通过查询条件过滤后,返回的行数与rows列估计的行数的比例。这个值越高,表示查询的过滤效果越好。

MySQL开启慢查询

在使用EXPLAIN之前,确实需要确保MySQL的慢查询日志功能已经开启,因为慢查询日志记录了执行时间超过阈值的SQL语句,这些语句往往是性能调优的重点。

以下是配置MySQL慢查询日志的步骤:

1. 配置慢查询日志参数

在配置文件中my.cnf或my.ini,找到或添加以下参数来配置慢查询日志:

vim /etc/mysql/my.cnf

[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 2 log_queries_not_using_indexes = 1

  • slow_query_log = 1:启用慢查询日志。
  • slow_query_log_file = /var/log/mysql/mysql-slow.log:指定慢查询日志文件的路径。请确保MySQL服务有权限写入这个文件。
  • long_query_time = 2:设置慢查询的阈值,单位是秒。这里设置为2秒,执行时间超过2秒的查询会被记录到慢查询日志中。
  • log_queries_not_using_indexes = 1:如果设置为1,MySQL会记录那些没有使用索引的查询,即使它们的执行时间没有超过long_query_time的阈值。

2. 重启MySQL服务

保存配置文件后,你需要重启MySQL服务以使更改生效。在Linux系统中,可以使用以下命令重启MySQL服务:

service mysql restart

3. 验证慢查询日志配置

重启服务后,你可以通过以下SQL语句来验证慢查询日志是否已经正确配置:

mysql -uroot -p SHOW VARIABLES LIKE 'slow_query_log%';


添加图片注释,不超过 140 字(可选)


确保slow_query_log的值为ONslow_query_log_file指向正确的日志文件路径。

DBA不让开慢查询

如果说公司DBA不让开启慢查询。

理由是:

慢查询日志会记录执行时间超过指定阈值的SQL语句,这会导致日志文件的增长。

每次记录慢查询日志时,都会涉及到磁盘I/O操作,这可能会对数据库的写入性能产生影响。尤其是在高负载环境下,频繁的磁盘写入可能会略微降低数据库的整体性能。

记录慢查询的过程可能会增加查询执行的额外开销。这种开销通常很小,但在极端情况下,对于那些非常接近慢查询阈值的查询,可能会因为记录日志而导致它们被错误地标记为慢查询。

这时可以通过重现业务操作,触发慢查询,然后执行

select * from information_schema.`PROCESSLIST` where info is not null;

查询当前有哪些脚本正在执行及占用时间


添加图片注释,不超过 140 字(可选)


准备阶段最核心的作用就是找出性能比较差的脚本是哪些。找到了就可以进行下一步的explain。

性能调优

使用 EXPLAIN 的步骤

步骤 1:识别慢查询

首先,我们需要识别出哪些查询是慢查询。可以通过 MySQL 的慢查询日志或者监控工具来获取这些信息。

调取慢查询日志文件

tail -f /var/log/mysql/mysql-slow.log


添加图片注释,不超过 140 字(可选)


步骤 2:使用 EXPLAIN 分析查询

把慢查询SQL脚本,使用 EXPLAIN 来分析这些查询

添加图片注释,不超过 140 字(可选)

步骤 3:解读 EXPLAIN 输出

调整前:


添加图片注释,不超过 140 字(可选)

explain结果


添加图片注释,不超过 140 字(可选)


分析 EXPLAIN 的输出,特别关注以下几个方面:

  • type:如果 typeALL,表示进行了全表扫描,这通常是性能问题的标志。如果 typeALL,考虑创建索引。


添加图片注释,不超过 140 字(可选)


  • ALL:全表扫描(Full Table Scan)。
  • index:索引扫描(Index Scan)。与全表扫描类似,但数据库扫描的是整个索引,而不是表。
  • range:范围扫描(Range Scan)。数据库使用索引来检索特定范围内的行。
  • ref:索引查找(Index Lookup)。数据库使用非唯一索引来查找与单个列上的等值条件匹配的行。
  • eq_ref:唯一索引查找(Unique Index Lookup)。
  • NULL:表示查询不需要访问表或索引,数据库可以直接从索引中获取结果,而不需要访问表。
  • key:实际使用的索引名称,如果 keyNULL,表示没有使用索引,需要创建或优化索引。
  • rows:如果 rows 的值很大,表示 MySQL 需要检查很多行,这可能是性能瓶颈。尝试优化查询条件,减少需要检查的行数。
  • Extra:如果出现了 Using filesortUsing temporary,这些都是性能问题的信号。

步骤 4:验证优化效果

在实施优化措施后,重新使用 EXPLAIN 分析查询,并监控查询的实际执行时间,以验证优化效果。


添加图片注释,不超过 140 字(可选)


此次生产上的问题主要是没有增加索引,这里还没对SQL本身进行大量优化。比如

  • like使用左右%时,索引会失效
  • 尽量不要使用三表或三表以上的联合查询
  • 尽量减少In的使用
  • .....


添加图片注释,不超过 140 字(可选)


此次复盘的主要目的是了解explain的基本概念及使用步骤。

另外还有非常重要的一点就是项目成员重视索引的重要性,建表时索引就一条语句而已。项目初期数据量小或许体现不出来,但当数据量大了的情况下索引的能力就尤为突出。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
SQL 监控 关系型数据库
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
【MYSQL高级】Mysql找出执行慢的SQL【慢查询日志使用与分析】
5234 0
|
前端开发 JavaScript 搜索推荐
计算机Java项目|基于SpringBoot的旅游网站的设计与实现
计算机Java项目|基于SpringBoot的旅游网站的设计与实现
998 0
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
11月前
|
缓存 数据库 索引
所有的接口都需要幂等吗?
幂等性(Idempotency)源自数学,指多次执行某操作结果不变。在计算机科学中,它确保在网络通信、重试机制和并发操作下系统状态一致。常见应用如HTTP方法中的GET、PUT、DELETE及数据库操作中的SELECT、UPDATE、DELETE等。实现幂等性可通过唯一请求ID、数据库约束、状态检查等方法。并非所有业务都需要幂等处理,需根据业务逻辑、系统容错策略及性能复杂度权衡。
146 0
|
11月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
4753 56
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
11月前
|
存储 Oracle 关系型数据库
索引在手,查询无忧:MySQL索引简介
MySQL 是一款广泛使用的关系型数据库管理系统,在2024年5月的DB-Engines排名中得分1084,仅次于Oracle。本文介绍MySQL索引的工作原理和类型,包括B+Tree、Hash、Full-text索引,以及主键、唯一、普通索引等,帮助开发者优化查询性能。索引类似于图书馆的分类系统,能快速定位数据行,极大提高检索效率。
189 8
|
11月前
|
人工智能 程序员 Linux
神秘山洞惊现AI绘画至宝Stable Diffusion残卷
随着AI神器的现世,不少修士担忧其会取代人类职业。然而,自女娲创造人类以来,法宝虽强,始终只是辅助工具,需修士操控才能发挥威力。如今修仙界最大的至宝是GPT,它能以文字为引,转化出所需答案。图片处理方面也有Stable Diffusion、DALL-E等法宝。这些AI工具并非替代修士,而是提升效率的助手。例如,Stable Diffusion最初由慕尼黑和海德堡大学宗师炼制,现已发展多个版本,如v1、v2.0、SDXL等,帮助修士更便捷地生成图像。通过合理使用这些工具,修士们可以更好地实现心中所想,而非被技术取代。
246 6
|
11月前
|
搜索推荐 API 定位技术
一文看懂Elasticsearch的技术架构:高效、精准的搜索神器
Elasticsearch 是一个基于 Lucene 的开源搜索引擎,以其强大的全文本搜索功能和快速的倒排索引技术著称。它不仅支持数字、文本、地理位置等多类型数据,还提供了可调相关度分数、高级查询 DSL 等功能。Elasticsearch 的核心技术流程包括数据导入、解析、索引化、查询处理、得分计算及结果返回,确保高效处理大规模数据并提供准确的搜索结果。通过 RESTful API、Logstash 和 Filebeat 等工具,Elasticsearch 可以从多种数据源中导入和解析数据,支持复杂的查询需求。
592 0