【mysql 提高查询效率】Mysql 数据库查询好慢问题解决

本文探讨了MySQL查询变慢的原因,包括索引使用、查询原理、执行过程和慢查询分析。重点关注了索引优化、连接数管理和Buffer Pool的影响。建议检查索引区分度、调整连接数及监控Buffer Pool命中率来提高查询效率。
摘要由CSDN通过智能技术生成

mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到。下面和大家一起聊聊如何解决这个问题。

遇到这种问题,我们一般也会想到是因为索引。看看是否没有建立索引,如果没有,相应应该建立索引。
如:

CREATE INDEX index_create_time ON temperature_new_output (create_time)

那除开索引之外,还有哪些因素会导致数据库查询变慢呢?要回答这个问题,我们 先从sql 语句的查询原理来说。Mysql架构 如下:

在这里插入图片描述

我们先来看下,一条查询语句下来,会经历哪些流程。
我们平常写的应用代码(pymysql之类),这时候就叫 客户端 了。

  1. 客户端底层会带着账号密码,尝试向mysql建立一条TCP长链接。
  2. mysql的 连接管理模块 会对这条连接进行管理。
  3. 建立连接后,客户端执行一条查询sql语句
  4. 客户端会将sql语句通过网络连接给mysql。
  5. mysql收到sql语句后,会在 分析器 中先判断下SQL语句有没有语法错误,如果有错误,会报错。
  6. 接下来是 优化器 ,在这里会 根据一定的规则选择该用什么索引 。
  7. 接下来 是 通过 执行器 去调用 存储引擎 的接口函数。存储引擎类似于一个个组件,它们才是mysql真正获取一行行数据并返回数据的地方,存储引擎是可以替换更改的,既可以用不支持事务的MyISAM,也可以替换成支持事务的Innodb。这个可以在建表的时候指定。现在最常用的是 InnoDB 。
  8. InnoDB 获取数据,返回客户端。

我们就重点说这个innoDB。InnoDB中,因为直接操作磁盘会比较慢,所以加了一层内存提提速,叫 buffer pool ,这里面,放了很多内存页,每一页16KB,有些内存页放的是数据库表里看到的那种一行行的数据,有些则是放的索引信息。
在这里插入图片描述
查询SQL到了InnoDB中。会根据前面优化器里计算得到的索引,去 查询相应的索引页 ,如果不在buffer pool里则从磁盘里加载索引页。 再通过索引页加速查询,得到数据页 的具体位置。如果这些数据页不在buffer pool中,则从磁盘里加载进来。这样我们就得到了我们想要的一行行数据。最后将得到的数据结果返回给客户端。

下面我们可以进行慢查询分析

我们可以通过开启 profiling 看到流程慢在哪。

mysql> show variables like 'profiling';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| profiling     | ON    |
+---------------+-------+
1 row in set (0.00 sec)

如果没有开启࿰
  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值