MySQL 调优:查询慢除了索引还能因为什么?

news2025/3/28 11:44:32

文章目录

    • 情况一:连接数过小
    • 情况二: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 的大小。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2320999.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何在百度搜索上删除与自己名字相关的资料

个人信息的网络足迹如同一张无形的网,将我们与世界的每一个角落紧密相连。然而,当某些与自己名字相关的资料不再希望被公众轻易检索到时,如何在百度搜索中有效“隐身”,成为了一个亟待解决的问题。面对复杂多变的网络环境&#xf…

使用外部事件检测接入 CDH 大数据管理平台告警

CDH 大数据管理平台 CDH(Cloudera Distribution Hadoop)是一个企业级的大数据平台,由 Cloudera 公司提供,它包含了 Apache Hadoop 生态系统中的多种开源组件,并对其进行了优化和集成,以支持大规模数据存储…

MongoDB(五) - Studio 3T 下载与安装教程

文章目录 前言一、Studio 3T 简介二、下载及安装1. 下载2. 安装 三、使用Studio 3T连接MongoDB 前言 本文旨在全面且深入地为你介绍 Studio 3T。从其丰富的功能特性、跨平台使用的便捷性,到详细的下载安装步骤,以及关键的连接 MongoDB 操作,…

汽车制造MES

一、整体生产工序 整车的车间主要分为4个部分:冲压、焊装、涂装、总装、整车入库 系统架构 二、车间概括 1.冲压车间 2.焊装车间 3.涂装车间 4.总装车间 1.整车装配的部件都要可追溯、数据实时性要求高、涉及分装与总装的协调、物流配送的协调、质量批处理的协调、…

信奥赛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基础设施的重要组成部分。本文将深入分析虚拟化的基本原理、主要类型以及在实际应用中的意义。 一、虚拟化技术的定义 虚拟化技术是通过软件将物理硬件资源抽象成虚拟资源的技术&…

小白闯AI:Llama模型Lora中文微调实战

文章目录 0、缘起一、如何对大模型进行微调二、模型微调实战0、准备环境1、准备数据2、模型微调第一步、获取基础的预训练模型第二步:预处理数据集第三步:进行模型微调第四步:将微调后的模型保存到本地4、模型验证5、Ollama集成部署6、结果测试三、使用总结AI是什么?他应该…

同旺科技USB to SPI 适配器 ---- 指令之间延时功能

所需设备: 内附链接 1、同旺科技USB to SPI 适配器 1、指令之间需要延时发送怎么办?循环过程需要延时怎么办?如何定时发送?现在这些都可以轻松解决; 2、只要在 “发送数据” 栏的Delay单元格里面输入相应的延迟时间就…

2024年MathorCup数学建模D题量子计算在矿山设备配置及运营中的建模应用解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 D题 量子计算在矿山设备配置及运营中的建模应用 原题再现: 随着智能技术的发展,智慧矿山的概念越来越受到重视。越来越多的设备供应商正在向智慧矿山整体解决方案供应商转型,是否具备提供整体解…

回归——数学公式推导全过程

文章目录 一、案例引入 二、如何求出正确参数 1. 最速下降法 1)多项式回归 2)多重回归 2. 随机梯度下降法 一、案例引入 以Web广告和点击量的关系为例来学习回归,假设投入的广告费和点击量呈现下图对应关系。 思考:如果花了…

Redisson分布式锁(超时释放及锁续期)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

音视频学习(三十):fmp4

FMP4(Fragmented MP4)是 MP4(MPEG-4 Part 14)的扩展版本,它支持流式传输,并被广泛应用于DASH(Dynamic Adaptive Streaming over HTTP)和HLS(HTTP Live Streaming&#xf…

Java安全-类的动态加载

类的加载过程 先在方法区找class信息,有的话直接调用,没有的话则使用类加载器加载到方法区(静态成员放在静态区,非静态成功放在非静态区),静态代码块在类加载时自动执行代码,非静态的不执行;先父类后子类,…

内存取证之windows-Volatility 3

一,Volatility 3下载 1.安装Volatility 3。 要求:python3.7以上的版本,我的是3,11,这里不说python的安装方法 使用 pip 安装 Volatility 3: pip install volatility3 安装完成后,验证安装: v…

fastapi+playwright爬取google搜索1-3页的关键词返回json

1,playwright无头 2,代理池随机获取代理ip 3,随机浏览行为,随机页面滚动 4,启用stealth模式 5,随机延时搜索 from fastapi import FastAPI, HTTPException from fastapi.responses import JSONResponse import asyncio from concurrent.futures import ThreadPool…

阿里云对象存储教程

搜“对象存储->免费试用” 选择你的心仪产品,我使用的是第一个 创建后获得三个实例: 点击右上角自己的账号可以进入到AccessKey管理界面 回到对象存储控制台创建Bucket实例 在以下文件中替换自己Bucket的信息即可美美使用~ package com.kitty.blog…

【Node.js入门笔记10---http 模块】

Node.js入门笔记10 Node.js---http 模块一、核心功能0.学习http的前提1. 创建 HTTP 服务器2. 处理请求和响应 二、进阶用法1. 路由管理2. 处理 POST 请求3. 中间件模式 三、常见场景四、错误处理与安全五、对比 http 与 Express六、工具库推荐: Node.js—http 模块 …