前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL慢查询(上):你知道为啥会慢么?

MySQL慢查询(上):你知道为啥会慢么?

作者头像
架构精进之路
修改于 2021-01-11 03:18:30
修改于 2021-01-11 03:18:30
1K01
代码可运行
举报
文章被收录于专栏:架构精进之路架构精进之路
运行总次数:1
代码可运行

发现的一些问题

问题1

在过去的半年时间里,研发团队内部尝试抓了一波儿慢查询SQL跟进处理率。发现有些同学对于慢查询处理的思路就是看看有没有用到索引,没有用到就试图加一个,实在不行就甩锅给这种情况是历史设计问题或者自行判定为用户特殊操作下触发的小概率事件,随即便申请豁免掉... 其实问题没有根本上解决。

问题2

还有就是网络上经常可以看到一些类似这样的文章:

“慢SQL性能优化大全”

“慢SQL性能优化看这篇就够了”...

其实内容大同小异,要么建议加索引,要么建议重写SQL....

怎么说呢?知识点是对的,但不全面,这个很容易误导新同学,哈哈哈。

本文初衷

在业务项目发展过程中,我们常常会面对要处理 MySQL 慢查询问题,那我们应该如何分析解决问题呢?

部分同学在处理MySQL慢查询时候主要思路是加索引来解决,确实加索引是一个很好的解决问题的手段,但不是全部。既然慢查询作为问题,那就需要明确问题发生原因,和解决问题路径分析, 授人以鱼不如授人以渔,让我们一起来解锁 ? 下MySQL处理慢查询的正确姿势。

本文计划主要让大家搞明白查询SQL为什么会变慢

问题处理流程
问题处理流程

废话不多说,直接开干~

写在前面

在业务项目发展过程中,我们常常会面对要处理 MySQL 慢查询问题,那我们应该如何分析解决问题呢?

部分同学在处理MySQL慢查询时候主要思路是加索引来解决,确实加索引是一个很好的解决问题的手段,但不是全部。既然慢查询是问题,那就需要明确问题发生原因,和解决问题路径分析。我们一起来get下MySQL慢查询的正确姿势。

一、查询SQL执行到底经历了什么?

首先需要明确:一个查询SQL的执行到底经历了什么?

数据库执行SQL的大致流程如下:

  • 建立与MySQL服务器连接(基础)
  • 客户端发送查询SQL到数据库,数据库验证是否有执行的权限
  • MySQL服务器先检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果,否则继续流转;
  • MySQL服务器语法解析器,进行词法与语法分析,预处理
  • 流转至查询优化器生成执行计划
  • 根据生成的执行计划,调用存储引擎暴露的API来执行查询
  • 将查询执行结果返回给客户端
  • 关闭MySQL连接

具体执行过程可能会因MySQL服务器具体配置和执行场景有一些差异。 1)如未开启应用查询缓存,则直接忽略查询缓存的检查; 2)执行过程中,如同时对于被扫描的行可能加锁,同时也可能会被其他sql阻塞

二、查询SQL为什么会慢?

我们可以把查询SQL执行看做是一个任务的话,那它是由一些列子任务组成的,每个子任务都存在一定的时间消耗。通常情况下,导致慢查询最根本的问题就是需要访问的数据太多,导致查询不可避免的需要筛选大量的数据。

面对慢查询,我们需要注意以下两点:

1)查询了过多不需要的数据

2)扫描了额外的记录

2.1 查询了过多不需要的数据

MySQL并不是只返回需要的数据,实际上会返回全部结果集再进行计算。

尤其是多表关联查询 select * 的情况,我们是不是真的需要全部的列呢?如果不是,那我们直接指定对应字段就好了。

例如我们要查询用户关联订单下的商品信息,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *
FROM users
  LEFT JOIN orders ON orders.user_id = users.user_id
  LEFT JOIN goods ON goods.good_id = orders.good_id
WHERE users.name = 'zhangsan';

这将返回三个表的全部数据列,可以调整为仅取需要的列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT goods.title, goods.description
FROM users
  LEFT JOIN orders ON orders.user_id = users.user_id
  LEFT JOIN goods ON goods.good_id = orders.good_id
WHERE users.name = 'zhangsan';

取出全部列,会让优化器无法完成索引覆盖扫描这类优化,还会为服务器带来额外的I/O、内存和CPU的消耗。

2.2 扫描了额外的记录

此种情况大部分属于索引应用不当造成的(包括:该建的索引没有建,或者未应用到最佳索引)。

示例表结构如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE TABLE `test_table` (
  `name` varchar(32) DEFAULT NULL,
  `desc` varchar(32) DEFAULT NULL,
  `age` int(16) DEFAULT NULL,
  `id` bigint(11) DEFAULT NULL,
  KEY `idx_age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

存在索引 `idx_age` 的情况下,查询执行计划结果展示如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
EXPLAIN SELECT * FROM test_table WHERE age = 10;

预估访问1行数据即可命中数据,如删除有效索引 `idx_age` 后则会变成全表扫描(ALL),预估需要扫描121524条记录才能完成这个查询,如下图所示:

小结

根据梳理 MySQL中的 SQL执行过程我们发现,任何流程的执行都存在其执行环境和规则,其实产生慢SQL的本质是:我们没有按照数据库的要求方式来执行SQL。

主要导致慢查询最根本的问题就是需要访问的数据太多,导致查询不可避免的需要筛选大量的数据。


限于文章篇幅,同时为了大家更好的阅读体验,后面会连续产出系列文章:

MySQL慢查询(中)

主要内容包括 如何定位慢查询问题和几种实用解决方案介绍

MySQL慢查询(下)

主要内容包括 高性能查询难题优化内容点总结

最后,欢迎大家持续关注~


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构精进之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET 10静默优化实战:LINQ与性能调优深度解析
在.NET 9中处理海量数据集时,IEnumerable的抽象层带来了高达83%的性能损耗。.NET 10通过底层优化将开销压缩至10%,实测客户数据流水线吞吐量提升15%:
郑子铭
2025/06/13
880
.NET 10静默优化实战:LINQ与性能调优深度解析
Unity性能调优手册9Unity的Script:空生命周期函数,tags,组件,string,显式销毁的类(Texture2D、Sprite、Material),burst
翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/
立羽
2023/11/27
5900
Unity性能调优手册9Unity的Script:空生命周期函数,tags,组件,string,显式销毁的类(Texture2D、Sprite、Material),burst
Unity性能调优手册2基础:硬件,渲染,数据,Unity如何工作,C#基础,算法和计算复杂度
翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/ 性能调优需要对整个应用程序进行检查和修改。因此,有效的性能调整需要广泛的知识,从硬件到3D渲染再到Unity机制。因此,本章总结了执行性能调优所需的基本知识
立羽
2023/11/19
1K0
Unity性能调优手册2基础:硬件,渲染,数据,Unity如何工作,C#基础,算法和计算复杂度
Unity性能调优手册1:开始学习性能调优
翻译自https://github.com/CyberAgentGameEntertainment/UnityPerformanceTuningBible/
立羽
2023/09/27
9810
Unity性能调优手册1:开始学习性能调优
从代码到性能:20个硬核.NET优化技巧,避开90%开发者踩过的坑
我深耕.NET技术栈十余年,专注于C#代码优化,深知普通开发者与高性能工程师之间的差距往往源于对细节的把控。性能优化并非依赖最新硬件或盲目扩展,而是从编码之初就贯彻高效原则。
郑子铭
2025/04/15
2290
从代码到性能:20个硬核.NET优化技巧,避开90%开发者踩过的坑
使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例
本文是一篇不可多得的好文,MemoryPack 的作者 neuecc 大佬通过本文解释了他是如何将序列化程序性能提升到极致的;其中从很多方面(可变长度、字符串、集合等)解释了一些性能优化的技巧,值得每一个开发人员学习,特别是框架的开发人员的学习,一定能让大家获益匪浅。
InCerry
2023/03/08
1.9K0
使用.NET7和C#11打造最快的序列化程序-以MemoryPack为例
foreach, 用还是不用,这是一个问题~
  接触过C#循环的朋友,想来对foreach应该不会陌生,相比一般的for循环方式,foreach显得更加优雅简洁,Unity支持C#脚本,平日使用中数组列表什么的自然也会遇到不少,想来foreach定然大有用武之地呀!
用户2615200
2018/08/02
1.6K0
foreach, 用还是不用,这是一个问题~
内存优化:Boxing
如今,许多开发人员都熟悉性能分析的工作流程:在分析器下运行应用程序,测量方法的执行时间,识别占用时间较多的方法,并致力于优化它们。然而,这种情况并没有涵盖到一个重要的性能指标:应用程序多次GC所分配的时间。当然,你可以评估GC所需的总时间,但是它从哪里来,如何减少呢? “普通”性能分析不会给你任何线索。
用户10786849
2024/06/07
1950
内存优化:Boxing
ILRuntime热更新
项目/教程地址:传送门 IL热更优点: 1、无缝访问C#工程的现成代码,无需额外抽象脚本API 2、直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net 4.6编译的DLL 3、执行效率是L#的10-20倍| 4、选择性的CLR绑定使跨域调用更快速,绑定后跨域调用的性能能达到slua的2倍左右(从脚本调用GameObject之类的接口) 5、支持跨域继承 6、完整的泛型支持 7、拥有Visual Studio的调试插件,可以实现真机源码级调试。支持Visual Studio 2015 U
[Sugar]
2022/09/21
2.6K0
项目优化之优化技巧进阶(Unity3D)
做游戏经验比较丰富的人都知道,优化的好坏一直是一个游戏的评判标准之一,它直接影响着玩家们的游戏体验,优化一直是项目中开发周期比较长的一个点,也是开发者头疼的一个问题,要求掌握的知识点比较全面,经验也要求比较丰富。 这篇文章参考很多文章的知识点,加以总结与学习,从最基础的概念讲起,配合讲解各种优化技巧,希望大家可以在我的文章中学到一些东西。
恬静的小魔龙
2022/08/07
2.1K0
项目优化之优化技巧进阶(Unity3D)
C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法
介绍性的语言集成查询 (LINQ) 文档中的大多数查询是使用 LINQ 声明性查询语法编写的。但是在编译代码时,查询语法必须转换为针对 .NET 公共语言运行时 (CLR) 的方法调用。 这些方法调用会调用标准查询运算符(名称为 Where、Select、GroupBy、Join、Max 和 Average 等)。 可以使用方法语法(而不查询语法)来直接调用它们。
张传宁IT讲堂
2019/09/17
4.3K0
C#3.0新增功能09 LINQ 基础07 LINQ 中的查询语法和方法语法
20个高效 .NET 开发技巧:让你的 C# 代码飞起来!
我已经使用 .NET 超过十年,优化过许多 C# 代码,并掌握了那些将普通开发者与高性能工程师区分开来的微妙细节。性能优化并不依赖于最新的硬件或扩展规模,而是从一开始就高效地编写代码。
郑子铭
2025/04/30
1600
20个高效 .NET 开发技巧:让你的 C# 代码飞起来!
Unity 游戏的 String interning 优化
本文探讨了在 Unity 中使用字符串池(string pooling)以减少内存分配和减少垃圾回收问题的方法。通过使用 C# 的 `string.Intern()` 方法,我们可以将重复的字符串放入一个全局的字符串池中,从而避免在程序运行过程中产生大量无用的字符串。这种方法特别适用于内存受限的环境,如嵌入式设备和性能要求较高的游戏引擎。同时,作者还介绍了一种自定义字符串类,该类提供了类似于 `string.Intern()` 的功能,但允许更细粒度的控制,包括指定哪些字符串要放入池中以及何时从池中移除。
serena
2017/08/22
1.2K0
Unity 游戏的 String interning 优化
[C#] 走进 LINQ 的世界
    技巧:《Linq To Objects – 如何操作字符串》 和 《Linq To Objects – 如何操作文件目录》
全栈程序员站长
2022/09/06
5.1K0
[C#] 走进 LINQ 的世界
【翻译】.NET 5中的性能改进
在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进。从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章,发现 谈论越来越多的东西。然而有趣的是,每次都想知道下一次是否有足够的意义的改进以保证再发表一篇文章。.NET 5已经实现了许多性能改进,尽管直到今年秋天才计划发布最终版本,并且到那时很有可能会有更多的改进,但是还要强调一下,现在已提供的改进。在这篇文章中,重点介绍约250个PR,这些请求为整个.NET 5的性能提升做出了巨大贡献。
李明成
2020/07/20
3.8K0
.NET性能优化-使用ValueStringBuilder拼接字符串
这一次要和大家分享的一个Tips是在字符串拼接场景使用的,我们经常会遇到有很多短小的字符串需要拼接的场景,在这种场景下及其的不推荐使用String.Concat也就是使用+=运算符。 目前来说官方最推荐的方案就是使用StringBuilder来构建这些字符串,那么有什么更快内存占用更低的方式吗?那就是今天要和大家介绍的ValueStringBuilder。
用户9127601
2022/06/09
5510
.NET性能优化-使用ValueStringBuilder拼接字符串
C#规范整理·集合和Linq
LINQ(Language Integrated Query,语言集成查询)提供了类似于SQL的语法,能对集合进行遍历、筛选和投影。一旦掌握了LINQ,你就会发现在开发中再也离不开它。
郑子铭
2023/08/30
5410
C#规范整理·集合和Linq
掌握25个C#实战技巧:从代码优化到高效开发
C#持续进化,每个版本都引入新特性,助你编写更高效、更优雅的代码。掌握以下技巧,不仅能提升代码质量,还能让开发过程更愉悦。
郑子铭
2025/04/18
2140
掌握25个C#实战技巧:从代码优化到高效开发
Java 代码性能调优“三十六”策
代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
技术zhai
2018/09/05
4580
Java 代码性能调优“三十六”策
Unity IL2CPP 游戏分析入门
很多时候App加密本身并不难,难得是他用了一套新玩意,天生自带加密光环。例如PC时代的VB,直接ida的话,汇编代码能把你看懵。
奋飞安全
2022/11/15
3.3K0
推荐阅读
相关推荐
.NET 10静默优化实战:LINQ与性能调优深度解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验