Mysql:InnoDB 关键特性

目录

一、插入缓冲(Change Buffer)→ 快递驿站的 “临时存放区”

二、两次写(Double Write)→ 重要文件的 “备份存档”

三、自适应哈希索引(AHI)→ 图书馆的 “热门书快捷查找区”

四、异步 IO(AIO)→ 餐厅的 “批量备菜”

五、刷新邻接页(Flush Neighbor Page)→ 打扫卫生 “顺手擦相邻桌子”

六、总结:每个特性都是 “为了解决某类性能 / 可靠性痛点”


一、插入缓冲(Change Buffer)→ 快递驿站的 “临时存放区”

场景类比
小区门口的快递驿站,每天收大量同小区的快递(对应 “非聚集索引的插入 / 更新”)。驿站不会每收到一个快递,就立刻送到用户家(对应 “直接写辅助索引页到磁盘”)—— 这样太折腾,效率低。

而是先把快递存在驿站仓库(Insert Buffer),等以下情况再批量送:

  • 业主来取其他快递时,顺路把同单元的快递一起送(对应 “辅助索引页被读到缓冲池时,合并插入”);

  • 仓库快满了(Insert Buffer Bitmap 检测到辅助索引页空间不足);

  • 每天固定时间(Master Thread 定时任务),批量送一批快递。

解决的问题
避免 “每次插辅助索引都要随机写磁盘”,把多次 “零散写” 变成 “批量写”,提升写入性能(尤其是写密集场景)。

限制
只有 “非唯一辅助索引” 才适用 —— 就像驿站只存 “同小区可批量送的快递”,如果是 “必须直接送到家的急件(唯一索引,需立即校验唯一性)”,就不能放驿站。

二、两次写(Double Write)→ 重要文件的 “备份存档”

场景类比
公司要保存一份重要合同(数据页,16KB 大小),怕保存时突然断电(数据库宕机),导致 “合同只写了前 4KB 就中断(部分写失效)”。

于是流程变成:

  1. 先把合同完整复印一份,存到公司的 “公共存档区”(doublewrite buffer 内存 + 共享表空间的 2MB 磁盘区域);

  2. 确认存档成功后,再把合同正式存到 “部门文件夹”(各个表空间文件)。

如果存部门文件夹时断电,重启后先从 “公共存档区” 把完整合同复制回来,再用重做日志(合同修改记录)补全细节 —— 保证合同(数据页)一定是完整的。

解决的问题
防止 “数据页部分写失效” 导致的损坏,是 InnoDB 数据可靠性的关键保障( redo 日志能修复 “内容错误”,但治不了 “页本身损坏”,两次写负责先保 “页的完整副本”)。

三、自适应哈希索引(AHI)→ 图书馆的 “热门书快捷查找区”

场景类比
图书馆的书按分类(B + 树)排列,但《Python 编程入门》特别火(热点页),每天被借几百次。

图书馆管理员发现后,在入口处设 “热门书快捷区”,直接标注 “《Python 编程入门》→ 3 楼第 5 排第 2 架”(哈希索引,O (1) 查找)。读者不用按 “计算机类→编程类→Python 子类” 的 B + 树层级找(3-4 次查询),直接通过快捷区找到,速度快很多。

解决的问题
对 “热点页” 自动生成哈希索引,把 B + 树的 “多层查询” 变成 “一次哈希定位”,提升热点数据的查询性能。

智能之处

  • 只对 “访问模式固定的热点页” 建哈希(比如反复用WHERE a=1查同一张表);

  • 自动监控访问频率(比如某页被同模式访问 100 次以上),不用 DBA 手动配置。

四、异步 IO(AIO)→ 餐厅的 “批量备菜”

场景类比
餐厅厨师要做三道菜,都需要番茄(对应三个 “读数据页” 的 IO 请求):

  • 同步 IO:做第一道菜时,去仓库拿番茄;做第二道菜时,再去拿;做第三道菜时,又去拿(三次 IO,每次等仓库回应)。

  • 异步 IO:厨师一次性告诉助手 “把三道菜的番茄都拿来”(合并 IO 请求),助手去仓库批量取(一次 IO 拿 48KB,覆盖三个 16KB 的页),效率更高。

解决的问题
把 “多次零散 IO” 合并成 “一次批量 IO”,提升磁盘 IOPS(每秒 IO 操作数),尤其适合 “连续读相邻页” 的场景。

五、刷新邻接页(Flush Neighbor Page)→ 打扫卫生 “顺手擦相邻桌子”

场景类比
打扫办公室时,发现桌子 A 脏了(脏页要刷新到磁盘)。同步操作是 “只擦桌子 A”;而刷新邻接页是 “擦桌子 A 时,发现旁边的桌子 B、C 也脏了,就一起擦了”。

这样的好处:

  • 机械硬盘场景:减少 “反复寻道(找不同桌子位置)” 的时间,一次寻道擦多张桌子,效率高;

  • 固态硬盘场景:不需要寻道,所以 MySQL 1.2 后可通过innodb_flush_neighbors=0关闭(固态 IOPS 足够,没必要多擦)。

解决的问题
传统机械硬盘下,利用 “邻接页一起刷” 减少寻道次数,提升批量刷脏页的效率。

六、总结:每个特性都是 “为了解决某类性能 / 可靠性痛点”

  • 插入缓冲:解决 “辅助索引写入频繁导致的随机写性能差”;

  • 两次写:解决 “数据页部分写失效导致的可靠性问题”;

  • 自适应哈希:解决 “热点页查询慢”;

  • 异步 IO:解决 “零散 IO 太多导致的效率低”;

  • 刷新邻接页:解决 “机械硬盘寻道次数多导致的刷盘慢”。

这些设计让 InnoDB 在 “写性能”“数据可靠性”“读性能”“IO 效率” 上达到平衡,成为 MySQL 最常用的存储引擎之一。

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

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

相关文章

STM32-----SPI

SPI简介SCK:和I2C中SCL的时钟线一个作用,都是在高电平拿出数据,在低电平写数据MOSI:主机输出从机输入MISO:主机输入从机输出,只有当对应从机的SS为低电平,从机的MISO引脚才能设置推挽输出,当从机SS为高电平时&#xff…

华为考试:HCIE数通考试难度分析

随着信息技术的飞速发展,网络技术已成为支撑各行各业运转的重要基础,市场对高水平网络技术人才的需求持续增长。HCIE作为华为认证体系中的最高级别认证,代表了网络技术领域的专业顶尖水平。本文将对HCIE数通认证的考试内容、难度及备考策略进…

一些常用的激活函数及绘图

深度网络的一些常用激活函数,并通过matplot绘制出来: import matplotlib.pyplot as plt import numpy as npdef relu(x):return np.maximum(0, x)def leaky_relu(x, alpha0.01):return np.where(x > 0, x, alpha * x)def gelu(x):return 0.5 * x * (1…

AE苹果手机iPhone 17展示动画片头模板 App Promo Phone 17 Pro

专为 App 发布会、电商促销、新品宣传 打造的 iPhone 17 Pro 动画展示 AE 模板。 4K 超清分辨率 26 张可替换照片位,无需第三方插件,拖拽即可输出专业级手机宣传片。 核心亮点 4K 超清:38402160 分辨率,大屏投放与社媒高清压缩无…

基于Python的云原生TodoList Demo 项目,验证云原生核心特性

以下是一个基于 Python 的云原生 TodoList Demo 项目,涵盖 容器化、Kubernetes 编排、CI/CD、可观测性、弹性扩缩容 等核心云原生特性,代码简洁且附详细操作指南,适合入门学习。项目概览 目标:实现一个支持增删改查(CR…

go 日志的分装和使用 Zap + lumberjack

自带的log无法满足 按大小轮转 ,按天数清理旧日志 ,自动压缩 ,限制备份数量 ,防止磁盘写满 ,生产环境推荐 等 使用 Zap lumberjack package mainimport ("go.uber.org/zap""go.uber.org/zap/zapcore&q…

【.Net技术栈梳理】01-核心框架与运行时(CLR)

文章目录1 .NET Runtime(CLR-公共语言运行时)1.1 中间语言 IL1.1.1 从源代码到通用中间语言(IL)1.1.2 运行时加载:CLR登场1.1.3 核心步骤:即时编译 (JIT Compilation)1.1.4 执行与内存管理(GC&a…

Claude Code 平替:OpenAI发布 Codex CLI ,GPT-5 国内直接使用

openai推出的命令行编程工具codex已经可以使用最新 GPT-5 模型,拥有可媲美 Claude Code 的 AI 编码能力。本文将指导你在 Windows 系统上部署原生的 Codex CLI 程序,并接入超低价中转 API,让你在国内直接用上超高性价比的 OpenAI Codex CLI 应…

在VS2022的WPF仿真,为什么在XAML实时预览点击 ce.xaml页面控件,却不会自动跳转到具体代码,这样不方便我修改代码,

在VS2022的WPF仿真,为什么在XAML实时预览点击 WpfApp1\FunctionalModule\08Replace\Replace.xaml页面控件,却不会自动跳转到具体代码,这样不方便我修改代码,

Git Bash 别名

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。Linux 系统中很多 shell,包括 bash,sh,zsh,dash 和 korn 等,不管哪种 shell 都会有一个 .bashrc 的隐藏文件,它就…

Centos7部署ceph存储

一、准备5台centos7主机 node节点双网卡&#xff08;1个内部检测&#xff0c;1个外部使用&#xff09;node节点都添加新网卡关闭防火墙和上下文都需要添加hosts文件都需要cat > /etc/hosts << EOF > 127.0.0.1 localhost localhost.localdomain localhost4 loca…

2025.9.10总结

今日感悟&#xff1a;刷到00后下班去菜市场捡菜的热点视频&#xff0c;确实挺有意思&#xff0c;不得不说&#xff0c;又省钱又好玩。虽然每天晚上能免费领个25块钱的水果回去&#xff0c;但确实没有什么新鲜感了。别人下班还能捡捡菜放松下&#xff0c;我下班&#xff0c;除了…

【数据结构与算符Trip第2站】稀疏数组

稀疏sparsearray数组 什么是稀疏数组&#xff1f; 稀疏数组是一种特殊的数据结构&#xff0c;用于高效存储和表示大部分元素为零&#xff08;或默认值&#xff09;的数组。它通过只存储非零元素的位置和值来节省内存空间。是一种压缩数组。 实现原理 在Go语言中&#xff0c;稀疏…

Sub-GHz无线收发单片机,低功耗物联网通信的硬件“基石”

随着物联网应用持续向规模化部署、广域化覆盖与高效化协同迈进&#xff0c; 作为IoT终端设备实现无线交互的核心通信单元之一——Sub-GHz无线收发单片机&#xff08;Sub-GHz射频收发芯片与单片机高度集成&#xff09;已成为系统设计中进一步简化外围元件数量、缩小硬件体积、降…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能

在 Vue3 中结合 TypeScript 封装表单绑定方案时&#xff0c;需要综合考虑类型安全、功能扩展性和开发体验。以下是一个包含防抖功能、支持多种表单控件、具备完整类型推导的封装方案&#xff0c;全文约 2300 字&#xff1a; 方案设计思路 组合式函数封装&#xff1a;使用 Vue3 …

中悦大华通过订单日记实现流程重构之路

一、客户背景 安徽中悦大华高速流体机械有限公司&#xff0c;成立于2023年&#xff0c;位于安徽省宣城市&#xff0c;是一家以从事电子设备制造为主的企业&#xff0c;在多年的商业经营中已成为业界翘楚。 在业务不断壮大的过程中&#xff0c;面临生产协作效率低&#xff0c;库…

【Springboot】介绍启动类和启动过程

【Springboot】介绍启动类和启动过程【一】Spring Boot 启动类的注解【1】核心注解&#xff1a;SpringBootApplication&#xff08;1&#xff09;​SpringBootConfiguration​&#xff1a;Spring容器会从该类中加载Bean定义&#xff08;2&#xff09;​EnableAutoConfiguration…

Gears实测室:第一期·音游跨设备性能表现与工具价值实践

在音游品类中&#xff0c;《跳舞的线》以 “音乐与操作节奏深度绑定” 的玩法特性&#xff0c;对设备性能提出了特殊要求 —— 稳定的帧率与低延迟的渲染响应&#xff0c;直接影响玩家对音符时机的判断&#xff0c;一旦出现卡顿或帧波动&#xff0c;易导致操作失误&#xff0c;…

格式刷+快捷键:Excel和WPS表格隔行填充颜色超方便

有时候我们会对Excel或WPS表格的数据区域每隔一行填充一个底纹&#xff0c;便于阅读和查看。可以使用条件格式搭配公式实现&#xff0c;也可以手动设置。通常手动设置的时候是先设置一行&#xff0c;然后再双击格式刷应用。可以有更快的方式&#xff1a;先设置一行底纹&#xf…

将现有Spring Boot项目作为模块导入到另一个Spring Boot项目

将现有Spring Boot项目作为模块导入到另一个Spring Boot项目的操作步骤如下&#xff1a;‌项目结构调整‌将待导入的项目文件夹复制到主项目的根目录下修改子模块目录名保持命名规范&#xff08;如ms-xxx格式&#xff09;‌父POM配置‌在主项目的pom.xml中添加<modules>声…