当前位置: 首页 > news >正文

MySQL 缓存机制与架构解析

目录

一、MySQL缓存机制概述

二、MySQL整体架构

三、SQL查询执行全流程

四、MySQL 8.0为何移除查询缓存?

五、MySQL 8.0前的查询缓存配置

六、替代方案:应用层缓存与优化建议

总结


一、MySQL缓存机制概述

MySQL的缓存机制旨在提升数据访问效率,主要分为两类:一级缓存二级缓存

  1. 一级缓存(InnoDB Buffer Pool)

    • 作用:存储数据和索引,减少磁盘I/O操作,由InnoDB存储引擎管理。

    • 特点:自动缓存热点数据,通过LRU算法淘汰冷数据。

    • 优化建议:通过参数 innodb_buffer_pool_size 调整缓存大小(通常设置为物理内存的70%-80%)。

  2. 二级缓存(Query Cache,MySQL 8.0前支持)

    • 作用:缓存SELECT查询的结果,直接返回重复查询的结果,避免重复计算。

    • 问题:在高并发写入场景中,频繁的缓存失效导致性能下降。


二、MySQL整体架构

MySQL采用分层设计,核心分为三层:

  1. 服务层(Service Layer)

    • 负责SQL解析、优化和执行,包含三大组件:

      • 解析器(Parser)

        • 词法分析:拆分SQL语句为关键字、表名等标记。

        • 语法分析:生成解析树(Parse Tree),验证语法正确性。

        • 语义检查:验证表、列是否存在及权限。

      • 优化器(Optimizer)

        • 逻辑优化:重写查询,消除冗余条件。

        • 物理优化:选择索引、连接方式(如JOIN顺序),生成成本最低的执行计划。

      • 执行器(Executor)

        • 权限校验后调用存储引擎接口执行计划,返回结果。

  2. 引擎层(Storage Engines)

    • 支持多种存储引擎(如InnoDB、MyISAM),负责数据存储和读写。

  3. 文件系统层(File System)

    • 存储表结构文件(.frm)、数据文件(.ibd)、日志文件(redo/undo log)等。


三、SQL查询执行全流程

一条SQL查询从发起到返回结果的完整流程:

  1. 客户端请求

    应用程序发送SQL语句到MySQL服务端。
  2. 解析器处理

    解析器验证语法并生成解析树。
  3. 优化器生成执行计划

    基于统计信息(如表大小、索引选择性)选择最优执行路径。
  4. 权限检查

    确认用户对目标数据的访问权限。
  5. 缓存查询(MySQL 8.0前)

    查询缓存(Query Cache)命中则直接返回结果。
  6. 执行器调用引擎

    执行器按计划调用存储引擎接口:

                (1)日志记录:写入redo log保证事务持久性。

                (2)一级缓存(Buffer Pool):若数据已在内存,直接读取;否则从磁盘加载。

    7. 结果返回与缓存更新

          返回结果集,更新缓存(若涉及写操作,缓存失效)。


四、MySQL 8.0为何移除查询缓存?
  • 高并发写入场景:频繁的DML操作导致缓存频繁失效,维护成本高。

  • 锁竞争:查询缓存需要全局锁,影响并发性能。

  • 替代方案成熟:推荐使用外部缓存(如Redis)或InnoDB缓冲池优化。


五、MySQL 8.0前的查询缓存配置
-- 启用查询缓存
SET GLOBAL query_cache_type = 1;  -- 1为启用,0为关闭
-- 设置缓存大小(64MB)
SET GLOBAL query_cache_size = 64 * 1024 * 1024;
-- 执行查询(命中缓存直接返回)
SELECT * FROM users WHERE id = 1;

六、替代方案:应用层缓存与优化建议
  1. 外置缓存(如Redis/Memcached)

  • 缓存热点数据(如用户信息、商品详情),降低数据库压力。
  • 支持分布式缓存,适合高并发场景。

      2. InnoDB缓冲池优化

  • 调整 innodb_buffer_pool_size 提升内存利用率。

  • 监控命中率:SHOW STATUS LIKE 'innodb_buffer_pool_read%';

  3. 本地缓存(如Guava Cache)

  • 适用于单机高频访问的小数据量场景。


总结

MySQL的缓存机制和架构设计是其高性能的核心。尽管MySQL 8.0移除了查询缓存,但通过合理利用InnoDB缓冲池、应用层缓存及优化执行计划,仍能显著提升性能。理解组件协作与执行流程,是数据库调优的关键基础。

相关文章:

MySQL 缓存机制与架构解析

目录 一、MySQL缓存机制概述 二、MySQL整体架构 三、SQL查询执行全流程 四、MySQL 8.0为何移除查询缓存? 五、MySQL 8.0前的查询缓存配置 六、替代方案:应用层缓存与优化建议 总结 一、MySQL缓存机制概述 MySQL的缓存机制旨在提升数据访问效率&am…...

LabVIEW自定义测量参数怎么设置?

以下通过一个温度采集案例,说明在 LabVIEW 中设置自定义测量参数的具体方法: 案例背景 ​ 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度,需自定义以下参数: 采样率:1 kHz 输入量程:0~10 V&a…...

海思的一站式集成环境Hispark Studio更新了

HiSpark Studio是海思提供的面向智能设备开发者提供一站式集成开发环境,支持代码编辑、编译、烧录和调试等功能。我以前在评测星闪芯片的时候用过,当时写了篇博客:【星闪开发连载】WS63E开发板Windows环境的构建_hispark studio-CSDN博客。那…...

TresJS:用Vue组件构建3D场景的新选择

在当今数字化时代,3D图形技术正以前所未有的速度发展,从游戏开发到虚拟现实(VR)、增强现实(AR),再到各种沉浸式体验,3D技术的应用场景日益丰富。TresJS作为一款基于Three.js的Web3D开…...

Axure设计教程:动态排名图(中继器实现)

一、开篇 在Axure原型设计中,动态图表是展示数据和交互效果的重要元素。今天,我们将学习如何使用中继器来创建一个动态的排名图,该图表不仅支持自动轮播,还可以手动切换,极大地增强了用户交互体验。此教程旨在提供一个…...

攻防世界 文件上传

题目名称-文件包含 今天的题大概提一下解题思路就好了 这里要使用php://filter 在此基础上因为网页过滤了一些关键字 我们要进行爆破 UCS-4* UCS-4BE UCS-4LE* UCS-2 UCS-2BE UCS-2LE UTF-32* UTF-32BE* UTF-32LE* UTF-16* UTF-16BE* UTF-16LE* UTF-7 UTF7-IMAP UTF-8* ASCII…...

从 .NET Framework 升级到 .NET 8 后 SignalR 问题处理与解决方案

随着 .NET Framework 向 .NET 8 的迁移,许多开发者在使用 SignalR 时遇到了一些前后端连接、配置、调用等方面的问题。尤其是在处理 SignalR 实时通信功能时,升级后的一些兼容性问题可能导致应用程序无法正常工作。本文将介绍在从 .NET Framework 升级到…...

《Node.js Express 框架》

《Node.js Express 框架》 引言 Node.js 是一种基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者使用 JavaScript 来编写服务器端代码。Express 是一个简洁、灵活的 Node.js Web 应用框架,它为 Web 和移动应用程序提供了一系列强大的功能。本文将详细介绍 Node.js …...

Unity LineRenderer 画线及代码控制--Unity小记

Unity LineRenderer 画线及代码控制 目录 Unity LineRenderer 画线及代码控制 一、添加LineRenderer 组件 二、LineRenderer设置起始坐标 三、设置LinRenderer 四、代码片段,找代码直接点我(找代码直接点我) 一、添加LineRenderer 组件…...

llama.cpp GGML Quantization Type

llama.cpp GGML Quantization Type 1. GGML Quantization Type2. static const struct ggml_type_traits type_traits[GGML_TYPE_COUNT]3. Q#_K_M and Q#_KReferences 什么神仙妖魔,不过是他们禁锢异族命运的枷锁! GGUF https://huggingface.co/docs/hu…...

k8s部署go-fastdfs

前置环境:已部署k8s集群,ip地址为 192.168.10.1~192.168.10.5,总共5台机器。 1. 创建provisioner制备器(如果已存在,则不需要) 制备器的具体部署方式可参考我的上一篇文章: k8s部署rabbitmq-CSDN博客文章浏览阅读254次,点赞3次,收藏5次。k8s部署rabbitmqhttps://blo…...

Python----Python高级(并发编程:协程Coroutines,事件循环,Task对象,协程间通信,协程同步,将协程分布到线程池/进程池中)

一、协程 1.1、协程 协程,Coroutines,也叫作纤程(Fiber) 协程,全称是“协同程序”,用来实现任务协作。是一种在线程中,比线程更加轻量级的存在,由程序员自己写程序来管理。 当出现IO阻塞时,…...

什么是可观测性?

现代服务架构常常谈及三个性: 弹性,韧性,可观测性。今天且按下其他两性不表,着重聊一聊可观测性。本文就几个主题对可观测性展开讨论: 可观测性是什么可观测性是必须的吗企业的可观测性落地 可观测性理念 可观测性是…...

3. 【.NET Aspire 从入门到实战】--理论入门与环境搭建--环境搭建

构建现代云原生应用程序时,开发环境的搭建至关重要。NET Aspire 作为一款专为云原生应用设计的开发框架,提供了一整套工具、模板和集成包,旨在简化分布式系统的构建和管理。开始项目初始化之前,确保开发环境的正确配置是成功的第一…...

kubeadm构建k8s源码阅读环境

目标 前面看了minikube的源码了解到其本质是调用了kubeadm来启动k8s集群,并没有达到最初看代码的目的。 所以继续看看kubeadm的代码,看看能否用来方便地构建源码调试环境。 k8s源码编译 kubeadm源码在k8s源码库中,所以要先克隆k8s源码。之…...

【Flink快速入门-1.Flink 简介与环境配置】

Flink 简介与环境配置 实验介绍 在学习一门新的技术之前,我们首先要了解它的历史渊源,也就是说它为什么会出现,它能够解决什么业务痛点。所以本节我们的学习目的是了解 Flink 的背景,并运行第一个 Flink 程序,对它有…...

硬盘修复后,文件隐身之谜

在数字时代,硬盘作为数据存储的重要载体,承载着无数珍贵的信息与回忆。然而,当硬盘遭遇故障并经过修复后,有时我们会遇到这样一个棘手问题:硬盘修复后,文件却神秘地“隐身”,无法正常显示。这一…...

如何处理网络连接错误导致的fetch失败?

处理由于网络连接错误导致的 fetch 失败通常涉及捕获网络错误并提供适当的用户反馈。以下是如何在 Vue 3 中实现这一点的步骤和示例。 一、更新 useFetch 函数 在 useFetch 函数中,需要捕获网络错误,并设置相应的错误信息。网络错误通常会抛出一个 TypeError,可以根据这个…...

Qt之设置QToolBar上的按钮样式

通常给QAction设置icon后,菜单栏的菜单项和工具栏(QToolBar)上对应的按钮会同时显示该icon。工具栏还可以使用setToolButtonStyle函数设置按钮样式,其参数为枚举值: enum ToolButtonStyle {ToolButtonIconOnly,ToolButtonTextOnly,ToolButtonTextBesideIcon,ToolButtonTe…...

责任链模式(Chain Responsibility)

一、定义:属于行为型设计模式,包含传递的数据、创建处理的抽象和实现、创建链条、将数据传递给顶端节点; 二、UML图 三、实现 1、需要传递处理的数据类 import java.util.Date;/*** 需要处理的数据信息*/ public class RequestData {priva…...

docker安装 mongodb

1、拉取镜像 docker run -dit --name mongo \ -p 17017:27017 \ -e MONGO_INITDB_ROOT_USERNAMEadmin \ -e MONGO_INITDB_ROOT_PASSWORD2018 \ --restartalways \ mongo2、进入容器 docker exec -it mongo bash 3、进入mongo ./bin/mongosh -u admin -p 2018 --authenticat…...

RabbitMQ 从入门到精通:从工作模式到集群部署实战(五)

#作者:闫乾苓 系列前几篇: 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(一)》:link 《RabbitMQ 从入门到精通:从工作模式到集群部署实战(二)》: lin…...

salesforce SF CLI 数据运维经验分享

SF CLI data默认使用bulk api v2, 数据操作效率有了极大的提高。 Bulk api v2的优点: 执行结果可以很直观的从Bulk Data Load Jobs中看到。相较于bulk api v1,只能看到job执行in progress,或者closed的状态,有了很大的改善。执行…...

5.2Internet及其作用

5.2.1Internet概述 Internet称为互联网,又称英特网,始于1969年的美国ARPANET(阿帕网),是全球性的网络。 互连网指的是两个或多个不同类型的网络通过路由器等网络设备连接起来,形成一个更大的网络结构。互连…...

【蓝桥杯—单片机】第十一届省赛真题代码题解题笔记 | 省赛 | 真题 | 代码题 | 刷题 | 笔记

第十一届省赛真题代码部分 前言赛题代码思路笔记竞赛板配置内部振荡器频率设定键盘工作模式跳线扩展方式跳线 建立模板明确设计要求和初始状态显示功能部分数据界面第一部分第二部分第三部分调试时发现的问题 参数设置界面第一部分第二部分和第四部分第三部分和第五部分 按键功…...

数据分析:企业数字化转型的金钥匙

引言:数字化浪潮下的数据金矿 在数字化浪潮席卷全球的背景下,有研究表明,只有不到30%的企业能够充分利用手中掌握的数据,这是否让人深思?数据已然成为企业最为宝贵的资产之一。然而,企业是否真正准备好从数…...

网络工程师 (23)OSI模型层次结构

前言 OSI(Open System Interconnect)模型,即开放式系统互联模型,是一个完整的、完善的宏观模型,它将计算机网络体系结构划分为7层。 OSI七层模型 1. 物理层(Physical Layer) 功能:负…...

DeepSeek添加知识库

1、下载dify 项目地址:https://github.com/langgenius/dify 2、通过docker安装 端口报错 修改端口 .env文件下所有80端口替换成了其它端口 执行正常了 查看 docker容器 <...

2、k8s的cni网络插件和基本操作命令

kube-prxoy属于节点组件&#xff0c;网络代理&#xff0c;实现服务的自动发现和负载均衡。 k8s的内部网络模式 1、pod内的容器于容器之间的通信。 2、一个节点上的pod之间的通信&#xff0c;docker0网桥直接通信。 3、不同节点上的pod之间的通信&#xff1a; 通过物理网卡的…...

Next.js简介:现代 Web 开发的强大框架(ChatGPT-4o回答)

prompt: 你是一位专业的技术博客撰稿人&#xff0c;你将写一篇关于介绍next.js这个开发框架的技术博文&#xff0c;语言是中文&#xff0c;风格专业严谨&#xff0c;用词自然、引人入胜且饶有趣味 在现代 Web 开发的世界中&#xff0c;选择合适的框架可以显著提升开发效率和应用…...