MySQL 调优:查询慢除了索引还能因为什么?
文章目录
- 情况一:连接数过小
- 情况二:Buffer Pool 太小
MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢?
以下以 MySQL 中一条 SQL 的执行流程为基础,分析 MySQL 查询慢除了索引还有哪些原因。
当 MySQL 中一条查询 SQL 在实际进入影响 SQL 执行效率的流程前(主要是优化器流程与执行器流程),首先会进入分析器流程。以 Python 进程为例,以下举例一条 MySQL 语句执行下来会经历哪些流程。
例如在 MySQL 中有一张名为 use_info 的数据表,一个 Python 进程尝试携带账号密码等信息尝试向 MySQL 建立一条网络连接,而 MySQL 的连接管理模块会对这条连接进行管理。
在连接被建立后,Python 应用尝试向 MySQL 服务器执行如下 SQL 查询语句:
SELECT user_name,user_address FROM user_info where user_id = 1;
此时 Python 进程需要将 SQL 语句通过网络连接给 MySQL,MySQL 收到 SQL 语句后将在分析器中先判断一下 SQL 语句有没有语法错误。例如 SELECT 是否少写个 L:
SEECT user_name,user_address FROM user_info where user_id = 1;
如果 SQL 错误,SELECT 中确实少写个 L,将抛出相关的异常提示:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEECT user_name,user_address FROM user_info where user_id = 1' at line 1
SQL 在分析器过程中执行无误后将到达优化器,而优化器会根据一些规则选择需要使用的索引,之后执行器会调用存储引擎的接口函数,MySQL 中的存储引擎是MySQL 中真正负责读写数据的组件。在如今的 MySQL 数据库开发中,最常用的存储引擎就是 InnoDB 存储引擎。
由于读写磁盘较慢,所以 InnoDB 存储引擎内部增加了一层名为 Buffer Pool 的内存提速设计, 在 Buffer Pool 中即存放行数据又存放索引数据。查询 SQL 到了 InnoDB 中会根据前面优化器里计算得到的索引去查询相应的索引页,如果索引页不在 Buffer Pool 里,则从磁盘里加载到索引页,再通过索引页查询得到数据页的位置。如果这些数据页不在 Buffer Pool 中,则从磁盘里加载进来,最后将得到的一行行数据结果返回给客户端。
在优化器流程与执行器流程过程中,数据库慢查询一般是优化器选错索引导致。这类问题可以通过 EXPLAIN 命令排查。
但是,除了索引之外,还有哪些因素会限制查询速度呢?
情况一:连接数过小
MySQL 的连接管理模块作用是管理客户端和 MySQL 之间的长连接,假设两者之间只有一条连接,那么在执行 SQL 查询之后只能阻塞等待结果返回,如果有大量查询同时并发请求,那么后面的请求都需要等待前面的请求执行完成后才能开始执行。因此有时候从应用程序的日志看,有些 SQL 执行了几分钟,但将 SQL 单独拎出来执行却只有几毫秒的情况。对于这种情况,实际上就是因为这些 SQL 语句在等待前面的 SQL 执行完成。
那么这个问题该如何解决呢?其实多建立一些连接就可以解决这个问题,多建一些连接目的是让请求能够并发执行,从而使后面的连接不需要等待那么久。但需要注意的是,连接数过小的问题受数据库和客户端两侧同时限制。
-
数据库连接数过小的情况:
MySQL 的最大连接数默认是100,最大可以达到 16384,可以通过如下命令将 SQL 的最大连接数改为500。
SET GLOBAL max_connections = 500;查看 MySQL 最大连接数配置命令:
SHOW GLOBAL VARIABLES LIKE 'max_connections'; -
应用侧连接数过小的情况:
如果数据库连接大小是调整过了,但却没啥效果,那可能是因为服务应用(如 Java 或 Python 应用等)的连接数也过小。应用侧与 MySQL 底层的连接是基于 TCP 协议的长连接,而建立长连接比较耗时,所以通常情况下会维护一个长连接池,要执行 SQL 时从里面捞出一条连接出来用,用完塞回去,下次复用。
需要注意的是,连接池的容量会有上限,连接池容量的上限指的是连接池能够控制的连接数量,如果连接池容量的上限太低,那么修改连接池最大连接数也没什么作用。
如果需要调大这个连接池该如何调呢?在实际编码中,通常服务应用(如 Java 或 Python 应用等)都会通过 ORM 库进行读写操作,而成熟的 ORM 库会有个连接池的配置,按照官方文档改就好。
情况二:Buffer Pool 太小
Buffer Pool 太小也会导致 MySQL 查询慢的问题。在前文提到的 InnoDB 存储引擎中里有一层内存 Buffer Pool,Buffer Pool 通过缓存磁盘数据用于加速查询,如果 Buffer Pool 越大,那么 Buffer Pool 中能够存放的数据页就越多,相应的 SQL 查询时就更可能命中 Buffer Pool,那么 MySQL 查询速度自然更快。
可以执行下面命令增大 Buffer Pool 的大小:
SET GLOBAL innodb_buffer_pool_size = 536870912;
innodb_buffer_pool_size 是 MySQL 中用于设置 Buffer Pool 的参数,它的单位为字节。上例中,将 innodb_buffer_pool_size 的值设置为 536870912 即将将 InnoDB 缓冲池的大小为 536870912 字节,换算成兆字节(MB)为 521 MB(因为 1 MB = 1024 * 1024 个字节)。
查询 innodb_buffer_pool_size 的大小命令:
SHOW GLOBAL VARIABLES LIKE 'innodb_buffer_pool_size';
输出的结果例如:

但是如果数据库查询慢并不是由于 Buffer Pool 的大小导致,那么修改 Buffer Pool 的大小就毫无意义。那么如何判断 Buffer Pool 是不是太小了?可以通过查看 Buffer Pool 的命中率来分析。
可以通过如下命令查询 Buffer Pool 的一些相关信息:
SHOW STATUS LIKE 'Innodb_buffer_pool_%';
得到的 Buffer Pool 相关信息例如:

其中 Innodb_buffer_pool_read_requests 表示请求的次数,Innodb_buffer_pool_reads 表示从物理磁盘中读数据的请求次数。
Buffer Pool 的命中率可以通过如下公式计算:
1-(Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests)*100%
例如上述 Buffer Pool 的命中率为:
1-(68759212/4966742025)*100% ≈ 98.6156%
一般情况下,Buffer Pool 的命中率都在 99% 以上,如果低于 99% 才需要考虑加大 Buffer Pool 的大小。
相关文章:
MySQL 调优:查询慢除了索引还能因为什么?
文章目录 情况一:连接数过小情况二:Buffer Pool 太小 MySQL 查询慢除了索引还能因为什么?MySQL 查询慢,我们一般也会想到是因为索引,但除了索引还有哪些原因会导致数据库查询变慢呢? 以下以 MySQL 中一条 S…...
Java实习生面试题(2025.3.23 be)
一、v-if与v-show的区别 v-show 和 v-if 都是 Vue 中的条件渲染指令,它们的主要区别在于渲染策略:v-if 会根据条件决定是否编译元素,而 v-show 则始终编译元素,只是通过改变 CSS 的 display 属性来控制显示与隐藏。 二、mybatis-…...
如何在百度搜索上删除与自己名字相关的资料
个人信息的网络足迹如同一张无形的网,将我们与世界的每一个角落紧密相连。然而,当某些与自己名字相关的资料不再希望被公众轻易检索到时,如何在百度搜索中有效“隐身”,成为了一个亟待解决的问题。面对复杂多变的网络环境…...
【C语言】C语言使用随机数srand,rand
C语言使用随机数srand,rand 可直接编译使用: #include <stdio.h> #include <time.h> #include <stdlib.h> #include <unistd.h>/* c语言提供的跟随机数有关的函数:int rand(void);返回值:产生的随机数void srand(unsiqned int seed);参数…...
为容器指定固定IP地址
文章目录 为容器指定固定IP地址可以通过以下步骤实现,适用于Docker环境:**方法一:使用Docker自定义桥接网络****方法二:Docker Compose配置****关键注意事项** 为容器指定固定IP地址可以通过以下步骤实现,适用于Docker…...
kube-score K8S Yaml静态代码分析工具详解
kube-score 是一款专注于 Kubernetes 配置文件的静态代码分析工具,旨在通过自动化检查帮助用户识别资源配置中的潜在问题,并遵循最佳实践以提升集群的安全性、稳定性和性能。以下是其核心功能、使用方法和应用场景的详细解析: 一、核心功能与…...
Spring Boot 整合 Elasticsearch 实践:从入门到上手
引言 Elasticsearch 是一个开源的分布式搜索引擎,广泛用于日志分析、搜索引擎、数据分析等场景。本文将带你通过一步步的教程,在 Spring Boot 项目中整合 Elasticsearch,轻松实现数据存储与查询。 1. 创建 Spring Boot 项目 首先ÿ…...
使用外部事件检测接入 CDH 大数据管理平台告警
CDH 大数据管理平台 CDH(Cloudera Distribution Hadoop)是一个企业级的大数据平台,由 Cloudera 公司提供,它包含了 Apache Hadoop 生态系统中的多种开源组件,并对其进行了优化和集成,以支持大规模数据存储…...
RabbitMQ八股文
RabbitMQ RabbitMQ 核心概念与组件1. RabbitMQ 核心组件及其作用1.1 生产者(Producer)1.2 交换机(Exchange)1.3 队列(Queue)1.4 绑定(Binding)1.5 消费者(Consumer&#…...
MongoDB(五) - Studio 3T 下载与安装教程
文章目录 前言一、Studio 3T 简介二、下载及安装1. 下载2. 安装 三、使用Studio 3T连接MongoDB 前言 本文旨在全面且深入地为你介绍 Studio 3T。从其丰富的功能特性、跨平台使用的便捷性,到详细的下载安装步骤,以及关键的连接 MongoDB 操作,…...
2025高频面试算法总结篇【链表堆栈队列】
文章目录 直接刷题链接直达反转链表环形链表判断一个序列是否为合理的出栈顺序最长有效括号旋转链表复杂链表的复制约瑟夫环问题滑动窗口最大值 直接刷题链接直达 反转链表 206. 反转链表 环形链表 141. 环形链表142. 环形链表 II 判断一个序列是否为合理的出栈顺序 946.…...
Java主流开发框架之请求响应常用注释
1.RestController 标记一个类为 REST 控制器,处理 HTTP 请求并直接返回数据(如 JSON/XML),而不是视图(如 HTML),一般是放在类的上边 RestController public class UserController {GetMapping…...
汽车制造MES
一、整体生产工序 整车的车间主要分为4个部分:冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…...
LeetCode 2643.一最多的行:模拟(更新答案)
【LetMeFly】2643.一最多的行:模拟(更新答案) 力扣题目链接:https://leetcode.cn/problems/row-with-maximum-ones/ 给你一个大小为 m x n 的二进制矩阵 mat ,请你找出包含最多 1 的行的下标(从 0 开始)以及这一行中…...
固定翼无人机姿态和自稳模式
固定翼无人机的姿态模式(Attitude/Angle Mode)和自稳模式(Stabilize Mode)是两种常见的飞行控制模式,它们在飞控系统介入程度、操作逻辑及适用场景上有显著区别。以下是两者的详细对比及使用指南: …...
K8S中若要挂载其他命名空间中的 Secret
在Kubernetes(k8s)里,若要挂载其他命名空间中的Secret,你可以通过创建一个 Secret 的 ServiceAccount 和 RoleBinding 来实现对其他命名空间 Secret 的访问,接着在 Pod 中挂载这个 Secret。下面是详细的步骤和示例代码…...
关于Unity的CanvasRenderer报错
MissingReferenceException: The object of type ‘CanvasRenderer’ has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEngine.UI.GraphicRaycaster.Raycast (UnityEng…...
LangChain组件Tools/Toolkits详解(5)——返回产出artifact
LangChain组件Tools/Toolkits详解(5)——返回产出artifact 本篇摘要14. LangChain组件Tools/Toolkits详解14.5 返回产出artifact14.5.1 定义工具14.5.2 使用ToolCall调用工具14.5.3 与模型一起使用14.5.4 从子例化BaseTool返回参考文献本章目录如下: 《LangChain组件Tools/T…...
信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队
信奥赛CSP-J复赛集训(模拟算法专题)(26):P5412 [YNOI2019] 排队 题目描述 小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全…...
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手
基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手 一、准备工作:组装你的"数码工具箱" 1. 安装基础工具(Python环境) 操作步骤: 访问Python官网下载安装包安装时务必勾选Add Python to…...
在 Offset Explorer 中配置多节点 Kafka 集群的详细指南
一、是否需要配置 Zookeeper? Kafka 集群的 Zookeeper 依赖性与版本及运行模式相关: Kafka 版本是否需要 Zookeeper说明0.11.x 及更早版本✅ 必须配置Kafka 完全依赖 Zookeeper 管理元数据2.8 及以下版本✅ 必须配置Kafka 依赖外置或内置的 Zookeeper …...
STM32基础教程——定时器
前言 TIM定时器(Timer):STM32的TIM定时器是一种功能强大的外设模块,通过时基单元(包含预分频器、计数器和自动重载寄存器)实现精准定时和计数功能。其核心原理是:内部时钟(CK_INT)或…...
深入分析和讲解虚拟化技术原理
随着云计算和大数据技术的飞速发展,虚拟化技术应运而生,成为数据中心和IT基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…...
HarmonyOS Next~鸿蒙图形开发技术解析:AREngine与ArkGraphics 2D的核心能力与应用实践
HarmonyOS Next~鸿蒙图形开发技术解析:AREngine与ArkGraphics 2D的核心能力与应用实践 鸿蒙操作系统(HarmonyOS)在图形开发领域持续创新,其核心图形类Kit——**AREngine(增强现实引擎服务)与Ar…...
Can通信流程
下面给出一个更详细的 CAN 发送报文的程序流程说明,结合 HAL 库的使用及代码示例,帮助你了解每一步的具体操作和内部原理。 一、系统与外设初始化 1.1 HAL 库初始化 在 main() 函数开头,首先调用 HAL 库初始化函数: HAL_Init()…...
小白闯AI:Llama模型Lora中文微调实战
文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…...
rip 协议详细介绍
以下是关于 RIP(Routing Information Protocol,路由信息协议) 的详细介绍,涵盖其工作原理、版本演进、配置方法、优缺点及实际应用场景。 1. RIP 协议概述 类型:动态路由协议,基于距离矢量算法(…...
同旺科技USB to SPI 适配器 ---- 指令之间延时功能
所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、指令之间需要延时发送怎么办?循环过程需要延时怎么办?如何定时发送?现在这些都可以轻松解决; 2、只要在 “发送数据” 栏的Delay单元格里面输入相应的延迟时间就…...
2024年MathorCup数学建模D题量子计算在矿山设备配置及运营中的建模应用解题文档与程序
2024年第十四届MathorCup高校数学建模挑战赛 D题 量子计算在矿山设备配置及运营中的建模应用 原题再现: 随着智能技术的发展,智慧矿山的概念越来越受到重视。越来越多的设备供应商正在向智慧矿山整体解决方案供应商转型,是否具备提供整体解…...
自动化机器学习(TPOT优化临床试验数据)
目录 自动化机器学习(TPOT优化临床试验数据)1. 引言2. 项目背景与意义2.1 临床试验数据分析的重要性2.2 自动化机器学习的优势2.3 工业级数据处理与GPU加速需求3. 数据集生成与介绍3.1 数据集构成3.2 数据生成方法4. 自动化机器学习与TPOT4.1 自动化机器学习简介4.2 TPOT在临…...
