MySQL Server端的缓存(查询缓存)是MySQL Server层的特性,而InnoDB的缓存(缓冲池)是InnoDB存储引擎层的特性。两者是完全独立的。

下面我们来深入探讨这两者以及InnoDB索引的原理。


1. MySQL Server层的缓存 - 查询缓存 (Query Cache)

  • 归属MySQL Server特性。它是一个全局性的组件,理论上对所有存储引擎(如InnoDB, MyISAM)的查询都可能生效。

  • 工作原理

    1. 当执行一个SELECT语句时,MySQL会先计算这个语句的哈希值,然后去查询缓存中查找是否有完全匹配(字节对字节完全相同)的查询结果。

    2. 如果找到(缓存命中),则直接返回结果,完全跳过解析、优化和执行阶段,效率极高。

    3. 如果未找到(缓存未命中),则继续执行查询,获取结果后,会将结果存储到查询缓存中,以备下次使用。

  • 失效机制非常粗粒度。只要对某张表进行了任何写操作(INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE等),那么所有与这张表相关的查询缓存都会全部失效并被清除。这对于写操作频繁的数据库来说,缓存命中率会非常低,维护缓存反而带来了巨大的性能开销。

  • 现状在MySQL 5.7中开始弃用,在MySQL 8.0中已被彻底移除。主要原因就是其弊大于利,在高并发读写场景下,缓存失效带来的争用甚至会导致性能下降。现在通常建议使用应用层缓存(如Redis, Memcached)来替代它。


2. InnoDB存储引擎的缓存 - 缓冲池 (Buffer Pool)

  • 归属InnoDB存储引擎的特性。这是InnoDB自身实现的核心组件。

  • 工作原理

    1. 缓冲池是主内存中的一片区域,用于缓存表和索引数据。当需要读取数据时,InnoDB会先检查数据页是否在缓冲池中。如果在(缓存命中),则直接读取内存,速度极快。

    2. 如果不在(缓存未命中),则从磁盘读取相应的数据页,并将其放入缓冲池中,然后再进行读取。

    3. 对于写操作,修改的也是缓冲池中的数据页。这些被修改但尚未刷新到磁盘的页称为脏页 (Dirty Page)。InnoDB有后台线程定期将脏页刷新到磁盘,这个过程称为刷脏 (Checkpointing)

  • 重要性这是InnoDB性能的核心。通过缓冲池,InnoDB将磁盘I/O操作最小化,将最多的操作在内存中完成。缓冲池的大小(通过 innodb_buffer_pool_size 参数设置)是MySQL性能调优最重要的参数,通常建议设置为服务器物理内存的50%-80%。

  • 与索引的关系:B+树索引的非叶子节点和频繁访问的叶子节点都会常驻在缓冲池中,这使得基于索引的查询速度非常快。


3. InnoDB索引使用与底层原理

索引数据结构:B+树

InnoDB使用B+树作为其索引的数据结构。B+树是为磁盘存储而优化的,它具有以下特点:

  • 矮胖树:层级很少,通常只需2-4次I/O就能在亿万级数据中找到目标。

  • 所有数据都存储在叶子节点:非叶子节点只存储键值(索引列的值)和指向子节点的指针,这使得非叶子节点可以存储大量键值,让树更“矮胖”。

  • 叶子节点形成有序链表:范围查询效率极高,只需找到范围的起始点,然后沿着链表遍历即可。

聚集索引 (Clustered Index)
  • InnoDB的表必须有一个聚集索引。

  • 数据行本身就直接存储在聚集索引的叶子节点上。因此,表数据本身就是按聚集索引的顺序物理存储的。

  • 通常,聚集索引就是主键(PRIMARY KEY)。如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果也没有,则会隐式创建一个 rowid 作为聚集索引。

二级索引 (Secondary Index)
  • 也叫非聚集索引或辅助索引。

  • 二级索引的叶子节点存储的不是完整的数据行,而是该行的主键值

  • 当通过二级索引查询时,需要先找到对应的主键值,然后再回到聚集索引中根据主键查找完整的行数据。这个过程称为回表 (Bookmark Lookup)

索引使用原则
  1. 最左前缀原则:对于联合索引 (a, b, c),它可以用于查询 a(a, b)(a, b, c) 的条件,但不能用于跳过 a 直接查询 b 或 c

  2. 覆盖索引 (Covering Index):如果查询的字段都包含在某个索引中(例如在索引 (a, b) 上查询 a, b),则引擎可以直接从索引中获取数据,而无需回表,极大提升性能。

  3. 索引下推 (Index Condition Pushdown, ICP):MySQL 5.6引入。在索引遍历过程中,提前对索引中包含的字段进行WHERE条件过滤,减少回表的次数。

  4. ps:如果没有索引下推优化(或称ICP优化),当进行索引查询时,首先根据索引来查找记录,然后再根据where条件来过滤记录;在支持ICP优化后,MySQL会在取出索引的同时,判断是否可以进行where条件过滤再进行索引查询。

总结与对比

特性MySQL Server查询缓存InnoDB缓冲池 (Buffer Pool)
归属层面MySQL Server层InnoDB存储引擎层
缓存内容完整的查询结果集表和索引的数据页
粒度粗(表级)细(页级,通常16KB)
失效机制对表的任何写操作导致所有相关缓存失效基于LRU算法和刷脏机制,精细管理
现状MySQL 8.0中已移除InnoDB核心组件,至关重要
目的避免重复执行相同的SQL查询减少磁盘I/O,加速数据访问

因此,在现代MySQL(尤其是8.0+)的架构讨论和性能优化中,我们关注的重点几乎完全在 InnoDB缓冲池 上,而早已不再考虑已被废弃的Server层查询缓存。理解缓冲池的工作原理和大小设置,是优化数据库性能的第一步,也是最关键的一步。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python实战:实现监测抖音主播是否开播并录屏

实现这个功能,主要思路是循环检查主播状态 → 开播后获取直播流地址 → 使用FFmpeg录制。下面是一个基本的步骤表格: 步骤 关键行动 常用工具/库 1 获取主播直播间ID或唯一标识 浏览器开发者工具、抓包工具1 2 循环请求抖音API,查询主播直播状态 requests, time 3 解析API响…

init / record / required:让 C# 对象一次成型

标签: init record required with表达式 不可变性 数据模型 DTO 目录1. init 访问器:让不可变对象的创建更灵活1.1. 概念1.1.1. 语法1.1.2. 语义1.2. 设计初衷:解决什么问题?1.3. 使用方法1.3.1. 在对象初始化器中赋值&#xff08…

每天五分钟深度学习:神经网络的权重参数如何初始化

本文重点 在逻辑回归的时候,我们可以将神经网络的权重参数初始化为0(或者同样的值),但是如果我们将神经网络的权重参数初始化为0就会出问题,上节课程我们已经进行了简单的解释,那么既然初始化为0不行,神经网络该如何进行参数初始化呢?神经网络的权重参数初始化是模型训…

[论文阅读] 告别“数量为王”:双轨道会议模型+LS,破解AI时代学术交流困局

告别“数量为王”:双轨道会议模型LS,破解AI时代学术交流困局 论文信息信息类别具体内容论文原标题From Passive to Participatory: How Liberating Structures Can Revolutionize Our Conferences主要作者及机构1. Daniel Russo(丹麦奥尔堡大…

趣味学solana(介绍)

你就是那个关键的“守门员”! 为了方便理解Solana,我们把Solana 想象成一个巨大的、24小时不停歇的足球联赛。成千上万的足球运动员(用户)在不停地传球、射门(发送交易),而整个比赛的结果必须被…

分布式事务性能优化:从故障现场到方案落地的实战手记(三)

第三部分:混合场景攻坚——从“单点优化”到“系统协同” 有些性能问题并非单一原因导致,而是锁竞争与事务耗时共同作用的结果。以下2个案例,展示综合性优化策略。 案例7:基金申购的“TCC性能陷阱”——从全量预留到增量确认 故障…

规则系统架构风格

考题 某公司拟开发一个VIP管理系统,系统需要根据不同商场活动,不定期更新VIP会员的审核标准和VIP折扣系统。针对上述需求,采用(__)架构风格最为合适。 A. 规则系统 B. 管道-过滤器风格 C. 事件驱动 D. 分层 一、什么是规则系统架构风格? 规则系统架构风格是一种将应…

kubeadm搭建生产环境的单master多node的k8s集群

k8s环境规划: podSubnet(pod 网段) 10.20.0.0/16 serviceSubnet(service 网段): 10.10.0.0/16 实验环境规划: 操作系统:centos7.9 配置: 4G 内存/4核CPU/40G 硬盘 网络:NAT K8s集群角色ip主…

React Device Detect 完全指南:构建响应式跨设备应用的最佳实践

前言 在现代 Web 开发中,设备检测是一个至关重要的功能。不同的设备(手机、平板、桌面)有着不同的屏幕尺寸、交互方式和性能特点,因此需要针对性地提供不同的用户体验。react-device-detect 是一个专门为 React 应用设计的设备检…

Spark专题-第一部分:Spark 核心概述(2)-Spark 应用核心组件剖析

这一篇依然是偏理论向的内容,用两篇理论搭建起Spark的框架,让读者有个基础的认知,下一篇就可以开始sql的内容了 第一部分:Spark 核心概述(2) Spark 应用核心组件剖析 1. Job, Stage, Task 的三层架构 理解 …

KMP 字符串hash算法

kmp算法 最大相同真前后缀: 如 ababa的最大真前后缀为aba, 而不是ababa(真前后缀与真子集类似,不可是本身,不然没意义) 所以next[1] 0;//string的下标从1开始 kmp模拟 next初始化&#xff…

HOT100--Day22--74. 搜索二维矩阵,34. 在排序数组中查找元素的第一个和最后一个位置,33. 搜索旋转排序数组

HOT100–Day22–74. 搜索二维矩阵,34. 在排序数组中查找元素的第一个和最后一个位置,33. 搜索旋转排序数组 每日刷题系列。今天的题目是《力扣HOT100》题单。 题目类型:二分查找。 关键: 今天的题目都是“多次二分” 74题&#xf…

Java分布式锁实战指南:从理论到实践

Java分布式锁实战指南:从理论到实践 前言 在分布式系统中,传统的单机锁机制无法满足跨进程、跨机器的同步需求。分布式锁应运而生,成为保证分布式系统数据一致性的关键技术。本文将全面介绍Java中分布式锁的实现方式和最佳实践。 1. 分布式锁…

(二叉树) 本节目标 1. 掌握树的基本概念 2. 掌握二叉树概念及特性 3. 掌握二叉树的基本操作 4. 完成二叉树相关的面试题练习

二叉树1. 树型结构(了解)1.1 概念1.2 概念(重要)1.3 树的表示形式(了解)1.4 树的应用2. 二叉树(重点)2.1 概念2.2 两种特殊的二叉树2.3 二叉树的性质2.4 二叉树的存储2.5 二叉树的基…

【Zephyr电源与功耗专题】13_PMU电源驱动介绍

文章目录前言一、PMU系统介绍二、Zephyr系统下驱动PMU的组成2.1:PMU系统在Zephyr上包括五大部分:2.2:功能说明2.3:B-core功能说明(Freertos)三、PMU各驱动API详解3.1:Power_domain3.1.1:初始化3.1.2:rpmsg回…

华清远见25072班网络编程学习day5

作业0> 将IO多路复用实现TCP并发服务器实现一遍程序源码&#xff1a;#include <25072head.h> #define SER_IP "192.168.153.128" //服务器ip地址 #define SER_PORT 8888 //服务器端口号 int main(int argc, const char *argv[]) {//1、创建一个…

【数据结构--顺序表】

顺序表和链表 1.线性表&#xff1a; 线性表是n个具有相同特性&#xff08;相同逻辑结构&#xff0c;物理结构&#xff09;的数据元素的有限序列。常见的线性表有&#xff1a;顺序表&#xff0c;链表&#xff0c;栈&#xff0c;队列&#xff0c;字符串…线性表在逻辑上是线性结构…

【PyTorch】图像多分类部署

如果需要在独立于训练脚本的新脚本中部署模型&#xff0c;这种情况模型和权重在内存中不存在&#xff0c;因此需要构造一个模型类的对象&#xff0c;然后将存储的权重加载到模型中。加载模型参数&#xff0c;验证模型的性能&#xff0c;并在测试数据集上部署模型from torch imp…

FS950R08A6P2B 双通道汽车级IGBT模块Infineon英飞凌 电子元器件核心解析

一、核心解析&#xff1a;FS950R08A6P2B 是什么&#xff1f;1. 电子元器件类型FS950R08A6P2B 是英飞凌&#xff08;Infineon&#xff09; 推出的一款 950A/800V 双通道汽车级IGBT模块&#xff0c;属于功率半导体模块。它采用 EasyPACK 2B 封装&#xff0c;集成多个IGBT芯片和二…

【系列文章】Linux中的并发与竞争[05]-互斥量

【系列文章】Linux中的并发与竞争[05]-互斥量 该文章为系列文章&#xff1a;Linux中的并发与竞争中的第5篇 该系列的导航页连接&#xff1a; 【系列文章】Linux中的并发与竞争-导航页 文章目录【系列文章】Linux中的并发与竞争[05]-互斥量一、互斥锁二、实验程序的编写2.1驱动…