龙空技术网

MySQL 查询变慢原因深度剖析及优化策略

安丫数据库小助手 62

前言:

如今同学们对“mysql 耗时”大概比较珍视,我们都想要学习一些“mysql 耗时”的相关文章。那么小编也在网上汇集了一些关于“mysql 耗时””的相关资讯,希望小伙伴们能喜欢,大家一起来了解一下吧!

#人生的焦虑来自哪里#

在DBA的日常工作中,MySQL 查询速度问题一直备受关注。尤其是当遇到查询慢的情况时,我们往往首先会想到索引问题。然而,MySQL 查询变慢可不仅仅是因为索引哦!那还有哪些因素会导致这种情况呢?今天就来和大家一起深入探讨一下。

一、数据库查询流程解析

首先,我们来了解一下一条 SQL 语句在 MySQL 中的执行流程。

比如说有一个数据库表,我们通过 Python 应用带着账号密码尝试使用 MySQL 语言进行连接。

MySQL 的连接管理模块会对这个连接进行管理。当建立连接后,Python 应用执行查询 SQL 语句,它会通过网络将语句发送给 MySQL。MySQL 接收到 SQL 语句后,会在分析器中先判断语句有没有语法错误,就像检查 “select” 是不是少打了个 “L”。

接着是优化器,它会根据一些规则选择该用什么索引。之后执行器会调用存储引擎的接口函数,要知道存储引擎可是真正读写数据的地方哦,现在最常用的是 InnoDB。

在数据查询过程中,如果数据查询比较慢,为了提速,InnoDB 内加了一层内存叫 buffer pool,里面既放数据也放索引。

当查询 SQL 到达应用 DB 中时,会根据前面优化器里计算得到的索引去查询相应的索引页。

如果索引页不在 buffer pool 里,就需要从磁盘里加载到索引页,再通过索引页查询得到数据的位置。要是这些数据也不在 buffer pool 中,同样要从磁盘里加载进来,最后将得到的一行行数据结果返回给客户端数据库。

二、除索引外导致查询变慢的因素及解决方法

(一)连接数过小

1.问题表现

MySQL 的连接管理模块负责管理客户端和 MySQL 之间的长连接。如果连接数过小,比如只有一条连接,那么在执行查询之后,只能锁的等待结果返回。

当有大量查询同时并发请求时,后面的请求都需要等待前面的请求执行完成后才能开始执行。

这就会出现从应用程序的日志看,有些 SQL 执行了几分钟,但单独拎出来执行却只有几毫秒的情况,就是因为这些语句在等待前面的执行完成。

2.解决办法

可以多建几条连接请求,让它们并发执行,这样后面的连接就不用等那么久了。连接数过小的问题受数据库和客户端两侧同时限制。

数据库连接数方面,MySQL 的最大连接数默认是 100,最大可以达到 16384,可以通过相关命令将最大连接数改为 500。

对于应用侧连接数过小的情况,如果数据库连接大小调整过了但没效果,可能是因为 Java、Python 应用的连接数也小。

应用侧与 MySQL 的连接基于 TCP,连接建立比较耗时,所以一般会维护一个长连接,执行 SQL 的时候从里面捞出一条连接出来用,用完再放回下次复用。

连接池会控制连接的数量,如果它小,即使修改数据库最大连接数也没什么作用,需要调整连接池的连接数。

像 Python 等成熟的 ORM 库会有连接池的配置,按照官方文档修改即可。

(二)buffer pool 太小

1.原理及影响

前面提到 InnoDB 里有一层内存 buffer pool,它用于缓存磁盘数据以加速查询。如果 buffer pool 越大,能放的数据页就越多,相应地,查询时更可能命中 buffer pool,查询速度自然就更快。

2.判断及调整方法

我们可以通过执行特定命令增大 buffer 的大小。但要注意,如果 buffer pool 大小正常,只是其他原因导致的查询变慢,那改 buffer pool 毫无意义。

那怎么知道 是不是太小了呢?

可以看 buffer pool 的相关指标,比如通过查看 “innodb_buffer_pool_read_requests” 表示读请求的次数,“InnoDB buffer pool read” 表示从物理磁盘中读数据的请求次数,通过计算可以得到 buffer pool 的命中率,一般情况下 buffer pool 命中率都在 99% 以上。

如果低于这个值,才需要考虑加大 InnoDB buffer pool 的大小。我们可以把这个命中率做到监控里,这样一旦出现问题就能及时定位原因,是不是很方便呢?

写在最后

好了,今天关于 MySQL 查询变慢的原因及解决方法就分享到这里啦。

如果你觉得这期文章对你有帮助,记得点赞分享给你身边的小伙伴哦。

最后问大家一个问题,你听说过 rabbit MQ 吗?你知道它的架构是怎么样的吗?

下期我们聊聊这个话题,如果你感兴趣,记得关注我们的微信公众号“安呀智数据坊”,我们下期见啦!

#数据库##MySQL# #程序员##职场##学习##我要上头条#

标签: #mysql 耗时