深入理解 MySQL InnoDB Buffer Pool 的 LRU 冷热数据机制

【信息科学与工程学】【云计算】计算机科学与自动化——第十五篇 云计算10 云计算领域架构 ​:作为前端请求的统一入口,负载均衡器基于预设算法(如轮询、最小连接数)动态分配流量至后端服务器集群。​:通过IP哈希或Cookie绑定,保障同一用户请求由同一服务器处理(如电商购物车场景)。​:Nginx(HTTP/HTTPS反向代理)、HAProxy(TCP层负载均衡)。​:实时监控服务器状态(如响应时间、连接数),自动剔除故障节点,确保服务连续性。​:本地资源满载时,将流量分流至公有云(如AWS + 私有云混合架构)。​:LSTM预测流量峰值,强化学习动态调整权重(如阿里云智能负载均衡)。 阅读详情

深入理解 MySQL InnoDB Buffer Pool 的 LRU 冷热数据机制

本文深入剖析 MySQL InnoDB 存储引擎如何通过定制化的 LRU 链表管理 Buffer Pool 中的冷热数据,有效解决缓冲池污染问题,保障数据库在高并发 CRUD 场景下的性能稳定。


目录


一、引言:为什么需要定制化的 LRU?

在 MySQL 的 InnoDB 存储引擎中,Buffer Pool(缓冲池) 是用于缓存数据页的内存区域,是提升数据库性能的核心组件。当执行 CRUD 操作时,数据页需要不断从磁盘读取并加载到 Buffer Pool 中。

如果采用传统的 LRU(Least Recently Used,最近最少使用) 算法,会面临一个严重问题:缓冲池污染(Buffer Pool Pollution)。

1.1 传统 LRU 的困境

传统 LRU 的规则很简单:新读取的页放在链表头部,最近访问的页移到头部,长时间未访问的页逐渐沉到尾部并被淘汰。

问题场景:当执行 SELECT * FROM t 全表扫描,或进行备份操作时,会一次性将大量很少被再次访问的数据页加载到 Buffer Pool。这些"冷"数据会占据链表头部,把原本频繁访问的"热"数据挤到尾部甚至淘汰出内存,导致后续业务查询性能急剧下降。

解决方案:MySQL 对 LRU 链表进行了定制化改造,实现了冷热数据分离的设计思想。


二、MySQL LRU 链表的结构

MySQL 的 LRU 链表并非简单的线性结构,而是被一个称为 MidPoint(中点) 的位置分割成两个子链表:

┌─────────────────────────────────────┐
│         New Sublist (Young)          │  ← 热数据区,约 5/8
│  Head ──────────────────── Tail      │
├─────────────────────────────────────┤  ← MidPoint
│         Old Sublist (Old)            │  ← 冷数据区,约 3/8
│  Head ──────────────────── Tail      │
└─────────────────────────────────────┘
区域占比存储内容
New Sublist约 5/8 (63%)频繁访问的 Young Page(热数据)
Old Sublist约 3/8 (37%)较少访问的 Old Page(冷数据)

三、核心流程图

3.1 数据页在 Buffer Pool 中的完整生命周期

Buffer Pool LRU 链表

磁盘

Old Sublist (3/8)

New Sublist (5/8)

① Midpoint 插入策略

② 再次访问且停留时间 > innodb_old_blocks_time

③ 未访问的页逐渐老化

④ 淘汰

数据页在磁盘

Head

Young Pages

Tail

Head / MidPoint

Old Pages

Tail

Evicted 释放空间

3.2 数据页插入流程(Midpoint Insertion Strategy)

是

否

从磁盘读取新数据页

Buffer Pool 有空间?

插入到 Old Sublist 的 Head
即 MidPoint 位置

从 Old Sublist Tail 淘汰页

页进入冷数据区等待

关键点:新页不会直接插入到整个 LRU 链表的头部,而是插入到 Old Sublist 的头部(MidPoint),避免一次性大量加载的冷数据污染热数据区。

3.3 页访问时的提升与优化逻辑

New Sublist

是

否

Old Sublist

是

否

页被访问

页在哪个区域?

是否在 New 区前 1/4?

不移动 - 减少锁竞争

移动到 New Sublist Head

停留时间 > innodb_old_blocks_time?

提升到 New Sublist Head

保持在 Old Sublist
防止全表扫描污染

访问完成


四、三大核心机制详解

4.1 Midpoint 插入策略

当 InnoDB 从磁盘读取新页到 Buffer Pool 时,采用 Midpoint Insertion(中点插入) 策略:

  • 插入位置:Old Sublist 的 Head(即整个 LRU 链表的 MidPoint)
  • 目的:防止全表扫描、备份等一次性加载的大量冷数据直接占据链表头部,保护热数据不被挤出

4.2 冷页提升机制(Promotion)

正常情况:当访问 Old Sublist 中的缓存页时,该页会被提升到 New Sublist 的 Head,成为热数据。

扫描保护:当通过 SELECT * FROM t 将大批数据加载到 Old Sublist 后,如果在不到 1 秒内再次访问这些页,这些被访问的页不会被提升为热数据。

  • 控制参数:innodb_old_blocks_time(默认 1000ms)
  • 原理:页必须在 Old Sublist 中停留超过该时间后,再次被访问才会触发提升
  • 效果:全表扫描产生的"一次性"访问不会污染热数据区

4.3 New Sublist 访问优化

对于已经在 New Sublist 中的页,InnoDB 做了进一步优化:

  • 规则:如果访问的是 New Sublist 前 1/4 的页,不会将其移动到 LRU 链表头部
  • 原因:这些页本身就是最热的数据,频繁移动会增加链表指针更新和 Mutex 竞争的开销
  • 收益:降低对最热数据的维护成本,提升并发性能

五、关键配置参数

5.1 innodb_old_blocks_pct

控制 Old Sublist 占整个 LRU 链表的比例。

-- 查看当前配置
SHOW VARIABLES LIKE '%innodb_old_blocks_pct%';
参数值含义
默认 37Old Sublist 约占 37%(约 3/8),New Sublist 约占 63%(约 5/8)
可调范围5 ~ 95

提示:用户可根据业务负载特点动态调整此参数,例如读多写少场景可适当增大 New 区比例。

5.2 innodb_old_blocks_time

控制页在 Old Sublist 中停留多久后,再次被访问才能提升到 New Sublist。

参数值含义
默认 10001000 毫秒(1 秒)
设为 0禁用时间检查,每次访问 Old 区页都会立即提升(可能增加污染风险)

适用场景:存在大量全表扫描或大范围扫描时,建议保持默认或适当调大,以增强缓冲池抗污染能力。


六、整体数据流动示意

数据流动

📥 新页从磁盘读入
→ 插入 Old Sublist Head (Midpoint)

⬆️ 被访问的 Old 页
→ 满足时间条件后提升到 New Sublist Head

⬇️ 未访问的 New 页
→ 逐渐老化下沉到 Old Sublist

🗑️ Old Sublist Tail 的页
→ 空间不足时被淘汰


七、Buffer Pool 全景视角

7.1 Buffer Pool 整体架构

LRU 链表只是 Buffer Pool 管理机制的一部分。InnoDB Buffer Pool 的完整架构如下:

链表管理

Buffer Pool 实例

Chunk (128MB)

Page Frame 1

Page Frame 2

...

Page Frame N

LRU List
冷热数据管理

Flush List
脏页管理

Free List
空闲页

组件说明
Page默认 16KB,InnoDB 与磁盘交互的基本单位
Chunk128MB 为单位申请内存,便于动态调整 Buffer Pool 大小
LRU List管理所有已缓存页的冷热顺序(本文核心)
Flush List按修改时间排序的脏页链表,用于刷盘
Free List空闲页链表,新页从此获取 Frame

注意:一个页可以同时存在于 LRU List 和 Flush List 中(脏页),两者职责不同。

7.2 预读机制与 LRU 的协同

InnoDB 的预读(Read-Ahead) 会提前将可能访问的页加载到 Buffer Pool,这些页同样遵循 Midpoint 插入策略:

预读类型触发条件与 LRU 的关系
线性预读顺序访问某个区(Extent)内连续 56 个页预读的页插入 Old Sublist Head,避免预读失败污染热区
随机预读同一区内 13 个页被访问同上,预读页从冷区入口进入

预读 + Midpoint 插入 = 即使预读不准确,也不会把真正的热数据挤出。

7.3 与其他系统的 LRU 对比

系统LRU 策略特点
MySQL InnoDB冷热分离 + 时间窗口抗全表扫描污染,可配置
Redis近似 LRU(采样淘汰)内存受限,采样减少开销
Linux Page Cache双链表 LRU(Active/Inactive)类似冷热分离思想
PostgreSQL无全局 LRU依赖 OS Page Cache,策略不同

可见"冷热分离"是应对扫描类负载的通用设计思路。


八、性能监控与调优

8.1 关键监控指标

-- 1. Buffer Pool 命中率(越高越好,建议 > 99%)
SELECT 
  (1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)) * 100 AS hit_ratio
FROM performance_schema.global_status 
WHERE VARIABLE_NAME IN ('Innodb_buffer_pool_reads', 'Innodb_buffer_pool_read_requests');

-- 2. LRU 相关状态
SHOW ENGINE INNODB STATUS\G
-- 查看 BUFFER POOL AND MEMORY 段中的 pages made young/not young 等

-- 3. 当前 Buffer Pool 配置
SHOW VARIABLES LIKE 'innodb_buffer_pool%';
指标含义
Innodb_buffer_pool_reads从磁盘读取的页数
Innodb_buffer_pool_read_requests逻辑读请求总数
pages made young从 Old 提升到 New 的页数
pages not made young因 innodb_old_blocks_time 未提升的页数

8.2 调优决策流程图

是

是

否

否

是

否

Buffer Pool 性能问题

命中率低?

存在大量全表扫描?

增大 innodb_old_blocks_time
如 2000~3000ms

增大 innodb_buffer_pool_size
或 innodb_old_blocks_pct 调小

pages not young 很多?

全表扫描多,考虑优化 SQL
或调大 innodb_old_blocks_time

整体健康,关注其他瓶颈

8.3 实战调优建议

场景建议
OLTP 高并发保持默认,关注 innodb_buffer_pool_size 是否足够
报表/分析型查询多适当增大 innodb_old_blocks_time,减少扫描污染
混合负载可尝试 innodb_old_blocks_pct=30 略增热区比例
Buffer Pool 预热重启后执行 SELECT * FROM 核心表 或使用 innodb_buffer_pool_dump_at_shutdown 预热

九、常见问题 FAQ

Q1:为什么我的热数据还是被挤出去了?

可能原因:

  1. Buffer Pool 太小:innodb_buffer_pool_size 建议设为物理内存的 60%~80%
  2. 全表扫描过多:检查慢查询,优化索引或拆分大表
  3. innodb_old_blocks_time 过小:扫描产生的页在 1 秒内被"误提升"

Q2:多实例 Buffer Pool 时 LRU 如何工作?

从 MySQL 5.5+ 起支持 innodb_buffer_pool_instances,每个实例有独立的 LRU、Flush、Free 链表,减少锁竞争,LRU 逻辑在每个实例内相同。

Q3:MySQL 8.0 有改进吗?

MySQL 8.0 对 Buffer Pool 的改进主要在:

  • 支持在线调整 innodb_buffer_pool_size(无需重启)
  • 更好的 Chunk 管理
  • LRU 冷热分离的核心算法保持稳定

十、总结

MySQL InnoDB 通过定制化的 LRU 链表,实现了冷热数据分离,有效解决了传统 LRU 的缓冲池污染问题:

机制作用
Midpoint 插入新页从冷区入口进入,避免一次性加载污染热区
时间窗口提升innodb_old_blocks_time 防止全表扫描页被误判为热数据
前 1/4 不移动减少对最热数据的链表维护开销
比例可配置innodb_old_blocks_pct 支持按业务调优

这种设计在保证热数据常驻内存的同时,让冷数据有"试用期",只有真正被频繁访问的页才能晋升为热数据,从而在高并发 CRUD 场景下维持数据库的稳定高性能。

Claude Code插件安装与VSCode深度集成实战指南 Claude Code是一款专为IDE设计的AI编程助手插件,其核心价值在于将自然语言意图转化为可运行代码,从而优化开发者认知带宽分配。它依赖Node.js运行时、git版本上下文和VSCode编辑器API三者协同工作,技术原理涉及本地进程通信、权限策略绕过、上下文感知补全等关键机制。该工具显著提升工程效率,适用于CLI开发、EXIF元数据处理、异步逻辑生成等典型JavaScript/TypeScript应用场景。本文聚焦Claude Code插件在VSCode中的真实落地链路,覆盖Windows/macO 阅读详情

相关推荐

实战指南:从零开始用YOLOv8训练VisDrone无人机检测模型

本文提供了一份详细的实战指南,手把手教你从零开始使用YOLOv8训练一个无人机检测模型。内容涵盖VisDrone数据集下载与格式转换、YAML配置文件编写、模型训练与评估,以及最终的推理部署,旨在帮助开发者快速掌握无人机视角下的目标检测技术。

salt的博客 682

什么是数据库的 “缓存池” ?(万字长文)

1、Buffer Pool 概述Buffer Pool 是什么?从字面上看是缓存池的意思,没错,它其实也就是缓存池的意思。它是 MySQL 当中至关重要的一个组件,可以这么说,MySQL...

程序员小灰的博客 1828

保姆级教程:用微信小程序+OneNet MQTT API,5分钟搞定温湿度数据实时展示

本文提供了一份详细的教程,教你如何利用微信小程序和OneNet MQTT API在5分钟内实现温湿度数据的实时展示。从OneNet平台配置到小程序数据绑定,手把手指导零基础开发者快速搭建监控系统,涵盖API调用、数据解析和界面设计等关键步骤。

weixin_30298497的博客 368

深入理解MySQL Buffer Pool的冷热数据分离:如何避免LRU链表的预读陷阱

本文深入探讨了MySQL Buffer Pool的冷热数据分离机制,重点解析了如何通过优化LRU链表避免预读陷阱。详细介绍了InnoDB存储引擎中Buffer Pool的核心架构、冷热数据分离原理及实战调优策略,帮助数据库管理员提升MySQL性能。

weixin_29213827的博客 201

游戏开发实战:用UE4 Marschner模型打造次世代头发渲染(附Shader代码解析)

本文详细解析了如何在UE4中使用Marschner模型实现次世代头发渲染,包括Shader代码逐行解读与参数调优。通过对比传统Kajiya-Kay模型,展示了Marschner模型在物理精确性和视觉效果上的优势,并提供了性能优化与实战技巧,帮助技术美术师提升游戏角色渲染品质。

weixin_28223453的博客 240

BUPT软件安全实验三

可以看出栈溢出对程序运行的安全性有很大的威胁,如果不对栈进行保护,只要系统中存在栈溢出漏洞,即可令攻击者通过非正当方法获取操作权限。(6)解决思考题,即:在不修改StackOverrun程序源代码的情况下,构造shellcode,通过JMP ESP的方式实现通过记事本打开shellcode.txt(可使用CreateProcessA或WinExec等API)。查看缓冲区信息,可以看到dest指向地址0x0012FAF0,其为数组的存放起始位置,也就是shellcode注入的起始位置。

7xun's space 1965

【MySql】深入理解 InnoDB 缓冲池(Buffer Pool)的核心机制

本文深入解析InnoDB缓冲池的核心机制,重点剖析数据/索引页缓存逻辑、冷热数据分离的LRU算法实现以及脏页刷新策略三大模块。缓冲池作为InnoDB性能的"生命线",通过内存缓存减少磁盘IO,其命中率直接影响MySQL性能。文章详细介绍了优化后的冷热分离LRU算法如何避免全表扫描污染热页,并分析了innodb_flush_log_at_trx_commit和innodb_flush_method等关键配置对性能和数据安全的影响。最后通过实战案例展示了缓冲池相关性能问题的排查优化方法,为高

小盘海的技术专栏 774

ARM交叉编译gdbserver并远程在线调试

arm-linux平台。5、生成完整的makefile,新建full_install,执行 ./configure --target=arm-linux-gnueabihf --host=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- CC=arm-linux-gnueabihf-gcc --prefix=/home/geyuxi/Documents/full_install。如果--host和--build不同,是交叉编译;

wangjie36的博客 3168

MySQL InnoDB Buffer Pool 技术深度剖析

MySQL InnoDB 的 Buffer Pool 是一个设计精巧、高度优化的内存缓存系统,它是支撑 InnoDB 高性能读写的核心。其内部通过多种数据结构协同工作,实现对数据页高效、智能的管理。数据页生命周期全览查找:当需要访问数据时,InnoDB 使用表空间号 + 数据页号作为 Key,在哈希表中快速查找。命中:若在哈希表中找到,则直接访问 Buffer Pool 中的缓存页。未命中从Free 链表获取一个空闲缓存页。从磁盘加载数据页到该缓存页。在哈希表中注册该页。

2302_80908396的博客 388

RK3568平台开发系列讲解:Linux wifi的调试

查询结果中state为ENABLE,表示hostapd程序启用成功。首先查看设备是否存在。

内核笔记 165

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

八:InnoDB Buffer Pool

磁盘页 ──加载──→ Buffer Pool(缓存页)│↓ ↓ ↓Free链表 LRU链表 Flush链表(空闲页) (冷热分区) (脏页管理)│(热数据│冷数据)Free 链表管理可用缓存页。哈希表实现 O(1) 定位缓存页。LRU 链表通过 young/old 分区解决缓存污染问题。Flush 链表管理脏页,实现异步刷盘。多实例 + Chunk提升并发能力并支持动态扩容。掌握这些底层机制,才能在生产环境中做出正确的参数调优决策,让 MySQL 发挥出最佳性能。

柳絮飘扬 626

AMDGPU IH(Interrupt Handler)实现分析

AMDGPU IH环形缓冲区机制是显卡驱动中高效处理GPU硬件中断的核心架构。该机制通过环形缓冲区存储中断事件,利用读写指针(wptr/rptr)同步硬件与驱动间的数据交互。硬件写入事件后驱动遍历处理,通过指针掩码实现环形循环,并具备溢出检测和虚拟化环境下的重置保护。其优势在于批量处理降低中断开销,指针同步确保可靠性,支持多队列扩展和SR-IOV虚拟化场景,为GPU中断管理提供了高性能基础架构。

图形/计算GPU的驱动与虚拟化技术分享园地 1635

深入理解InnoDB缓冲池:原理、配置与状态监控

在MySQL数据库中,InnoDB存储引擎的性能表现与缓冲池(Buffer Pool)的设计和配置密切相关。缓冲池作为InnoDB的核心内存组件,主要用于缓存磁盘上的数据页、索引页等,通过减少磁盘I/O操作显著提升数据库读写效率。本文将从缓冲池的核心原理、关键配置方法以及状态监控三个维度,带你全面掌握InnoDB缓冲池的应用技巧。

专注Java和MySQL领域知识分享 928

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【吃透 MySQL InnoDB连载】第 7 章・InnoDB 内存与页机制

本章针对无慢 SQL 却高峰期卡顿、数据库长期性能衰减两类线上疑难故障,讲解 InnoDB 以 16KB 数据页为核心的内存架构。介绍 Buffer Pool 三大链表、冷热分区 LRU 算法,依靠中点插入机制避免批量冷数据冲刷热点缓存;剖析脏页异步刷盘逻辑与 IO 雪崩隐患,说明页碎片生成原理及对查询性能的持续损耗。配套碎片检测清理方案与缓冲池、冷热缓存、脏页刷盘全套内核调优参数,从内存底层解决性能抖动、逐年变慢问题,完善 MySQL 底层优化知识体系。

热爱各类技术,习惯把实践沉淀成文,已出版 MySQL、智慧养老架构相关专业书籍。日常深耕数据库优化、行业系统架构设计,也广泛关注各类后端、数字化相关技术方向。博客分享真实项目经验、技术踩坑与架构设计思路,和同好一起交流学习,共同成长。 578

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

MySQL 深入理解-专辑demo

MySQL 采用分层架构设计,从上到下分为四层: 1.1.1 连接层 连接管理:处理客户端连接、认证、授权 连接池:复用已建立的连接,减少连接开销 线程模型:每个连接分配一个线程(One-Thread-Per-Connection) 1.1.2 服务层 服务层是 MySQL 的核心,包含 SQL 处理的完整流程:SQL 执行流程: 1.1.3 存储引擎层 MySQL 的插件式存储引擎架构是其最大特色: 1.2 MySQL 8.0 新架构特性 1.2.1 数据字典重构 MySQL 8.0 使用事务性数据

_abab的专栏 285

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

《MySQL技术内幕》启示:InnoDB索引、事务与锁机制深度解析

理解数据库内核原理是优化性能与排查故障的基础。MySQL通过可插拔存储引擎架构,使InnoDB凭借完整的事务支持、崩溃恢复与行级锁成为默认选择。其核心设计包括:基于B+树的聚簇索引让表数据按主键有序存储,二级索引通过回表获取数据,覆盖索引则能避免额外IO;预写日志(WAL)以顺序写保障事务提交性能,redo log确保崩溃恢复,undo log结合MVCC实现多版本并发控制;间隙锁与Next-Key Lock则在可重复读隔离级别下防止幻读。掌握这些原理,不仅能理解为何推荐自增主键、如何设计联合索引,还能快速

weixin_31188927的博客 185

MySQL Innodb 页缓存管理原理

在数据库性能优化中,InnoDB存储引擎的页缓存(Buffer Pool)机制是核心组件之一。InnoDB的页缓存以固定大小的页(默认16KB)为单位管理,采用改进的LRU(最近最少使用)算法。LRU链表分为“新生代”和“老生代”,新加载的页先插入老生代中点,只有被再次访问时才晋升到新生代。通过上述机制,InnoDB页缓存实现了高效的内存管理与磁盘I/O优化,成为MySQL高性能的基石。为减少锁竞争,InnoDB支持多Buffer Pool实例,每个实例独立管理LRU和刷盘。缓存结构与LRU算法。

aasncx_711的博客 257

goalng开发_开发篇

Go 面试,基础知识

qq_46640341的博客 1159

MySQL建库建表操作学习笔记

SQL(Structured Query Language,结构化查询语言)是用于在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。:用于定义对数据库对象(库、表、列、索引)的操作,如 CREATE、DROP、ALTER、RENAME、TRUNCATE 等。保存可变长度的字符串(可包含字母、数字以及特殊字 符)。:用于定义对数据库记录的操作,如 INSERT、DELETE、UPDATE、SELECT 等。:用于定义对数据库、表、字段、用户的访问权限和安全级别,如 GRANT、REVOKE 等。

Eternitycai的博客 222

MySQL 索引深入理解:B+ 树、二级索引、联合索引与查询优化

理解二级索引后,就可以理解回表了。SELECT *MySQL 的执行过程分为三个步骤。覆盖索引(Covering Index)并不是一种独立的索引类型,而是一种查询效果。SQL 查询需要的所有字段,都能够直接从某个索引中获得,不需要再访问聚簇索引获取其他字段。例如:因为user_id已经包含在二级索引中,所以 MySQL 可以直接返回结果。不需要回表。联合索引(Composite Index)是同时使用多个字段建立的索引。它的排序规则是:首先按照user_id排序。当user_id。

m0_64642997的博客 131

MySQL 单点详解(14)

给定一条 SQL,联合索引的列该怎么排呢?

2401_88601046的博客 344

MySQL 的 REPEATABLE READ 到底能不能防幻读——从快照读、当前读到 Next-Key Lock

本文系统讲解 InnoDB 可重复读级别下的幻读问题:从三类读异常切入,剖析快照读依赖 MVCC、当前读依赖 Next-Key Lock 的双防线机制,用双会话实验复现幻读仍会出现的边界场景,并解释各数据库在幻读防护上行为分歧的根源。

大模型全栈工程师 · Thanks_ks 295

Flink SQL 连接器实战:MySQL Source、Flink CDC 与 JDBC Sink 全解析

提供有界流读取,适合批处理和维表场景,简单直接但无法感知变更。MySQL CDC提供无界流读取,通过「全量快照 + binlog 增量」的方式实现实时捕获,是实时数仓的核心入口,但需要 MySQL 侧正确配置 binlog 和权限。JDBC Sink负责结果回写,关键在于区分仅插入流和更新流,更新流必须依赖主键完成 upsert。掌握这三者的差异,本质上就是掌握了 Flink 中「有界与无界」「追加与更新」这两组最基本的语义。

2401_83857914的博客 430

Docker 部署 WordPress+MySQL 高可用架构

点「安装 WordPress」

一直在努力学习的菜鸟 223

SQLite 是什么?和 MySQL、Redis 有什么区别,项目中应该怎么选?

SQLite 是轻量级嵌入式关系型数据库,无需独立服务,直接通过文件存储数据,适合本地工具、桌面应用、移动端离线数据及单机轻量业务。与 MySQL 相比,它部署简单但并发写入受限;与 Redis 不同,它支持完整 SQL 与事务,适用于结构化数据持久化。三者可协同使用:MySQL 处理核心业务,Redis 实现高速缓存与计数,SQLite 降低部署复杂度。选型应基于场景需求,而非技术偏好。

栈外手记|2018 年起深耕后端开发。跳出代码栈,分享技术、项目踩坑与行业思考,看见技术之外更多可能。 333
上一篇: MySQL三大日志深度解析:redo log、undo log、binlog 原理与实战
下一篇: MySQL InnoDB 缓存池(Buffer Pool)详解:原理、结构与链表管理
闻哥
博客等级 码龄8年 210粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闻哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值