Hacker News

Select 和 Disk 之间的三个缓存层

Select 和 Disk 之间的三个缓存层 本次探索分为三个部分,考察其重要性和潜在影响。 — Mewayz 商业操作系统。

5 最小阅读量

Mewayz Team

Editorial Team

Hacker News

当您的应用程序触发一条 SELECT 语句时,数据几乎从不直接从磁盘读取——它会穿越三个独立的缓存层,每一层都在静默地决定响应是在微秒还是毫秒内抵达。理解这三个缓存层,正是能够轻松扩展的业务平台与在真实负载下崩溃的业务平台之间的关键区别。

当 SELECT 查询离开应用程序时究竟发生了什么?

当应用程序发送 SELECT 查询时,它进入了一条大多数开发者从未仔细审视过的管道。数据库引擎在任何 I/O 操作发生之前就拦截了请求,将 SQL 解析为内部执行计划,并立即查阅它的第一道防线:查询结果缓存(Query Result Cache)。如果最近执行过具有相同参数的相同查询,引擎可以直接返回缓存的结果集,而无需触及哪怕一页数据。

这种机制有时被称为查询缓存或结果缓存。在高读取、低写入的工作负载中——例如分析仪表板和报告模块——它可以完全消除绝大多数磁盘读取操作。在 Mewayz 平台的 207 个业务模块中,许多模块(如数据看板、客户统计面板)恰好属于这类高读取场景,查询缓存在此类场景中发挥着至关重要的作用。

但这里有一个关键点:查询缓存对数据变更极度敏感。对底层表的任何 INSERTUPDATEDELETE 操作都会使相关的缓存结果失效。这就是为什么写入密集型的事务系统通常会完全禁用查询缓存,转而依赖更深层的缓存机制。值得注意的是,MySQL 8.0 已经完全移除了内置查询缓存,原因正是在高并发写入场景下,缓存维护的开销超过了其带来的收益。

缓冲池为什么比你想象的更重要?

第二个缓存层——也是生产系统中可以说最为重要的一层——是缓冲池(Buffer Pool)。以 InnoDB 引擎为例,缓冲池是一块专门分配的内存区域,用于存储最近访问过的数据页和索引页。当查询需要读取数据时,引擎首先检查该页是否已经在缓冲池中;如果命中,读取在纯内存中完成,速度比磁盘 I/O 快数个数量级。

缓冲池采用改良的 LRU(最近最少使用)算法来管理页面淘汰。与查询缓存不同,缓冲池不会因为单次写入操作而大面积失效——它缓存的是数据页本身,而非查询结果。这意味着即使在频繁写入的场景下,缓冲池依然能够为读取操作提供显著的加速。

核心洞察:在一个调优良好的生产数据库中,缓冲池的命中率应当维持在 99% 以上。如果这个数值低于 95%,几乎可以确定您的数据库正在进行大量不必要的磁盘读取,查询延迟将显著上升。对于承载 138,000 多名用户的平台而言,缓冲池的每一个百分点都直接关联着用户体验。

实际配置中,缓冲池的大小通常建议设置为可用物理内存的 70%-80%。在专用数据库服务器上,这个比例可以更高。对于运行多个业务模块的 SaaS 平台,合理的缓冲池配置能够在不增加硬件成本的情况下大幅提升吞吐量。

操作系统的页缓存扮演着什么角色?

即使查询未命中查询缓存,也未在缓冲池中找到所需的数据页,在数据真正从物理磁盘读取之前,还有第三道防线:操作系统页缓存(OS Page Cache)

💡 您知道吗?

Mewayz在一个平台内替代8+种商业工具

CRM·发票·人力资源·项目·预订·电子商务·销售点·分析。永久免费套餐可用。

免费开始 →

Linux 内核会自动将从磁盘读取过的文件块缓存在空闲的物理内存中。当数据库引擎发起文件读取系统调用时,内核首先检查页缓存。如果数据已经存在于页缓存中,读取操作完全在内存中完成,而数据库引擎甚至感知不到这个过程——它只知道系统调用返回得很快。

页缓存的工作方式与缓冲池形成了有趣的互补关系。需要注意以下几个要点:

  • 双重缓存问题:InnoDB 使用 O_DIRECT 标志绕过页缓存以避免同一份数据被缓存两次,但 MyISAM 和许多其他存储引擎仍然依赖页缓存
  • 预读优化:操作系统会根据访问模式自动执行预读(readahead),在顺序扫描场景下可以显著减少 I/O 等待
  • 内存压力管理:当系统内存紧张时,内核会根据 LRU 策略淘汰页缓存中的数据,这可能导致数据库性能出现突发性下降
  • 透明性:页缓存对应用层完全透明,无需任何配置即可生效,但同时也意味着它的行为较难精细控制
  • SSD 环境下的价值:即使在 NVMe SSD 上,页缓存命中仍然比直接磁盘读取快 10-100 倍,因此其价值在现代硬件上依然显著

三个缓存层如何协同工作提升平台性能?

理解这三个缓存层的协同关系,是构建高性能业务平台的基础。一条典型的 SELECT 查询首先检查查询结果缓存,未命中则进入缓冲池查找数据页,再未命中则通过操作系统页缓存尝试拦截,最终才会触发真正的物理磁盘 I/O。

在实际生产环境中,合理配置这三个层级可以使超过 99.9% 的读请求在内存中完成。这意味着对于像 Mewayz 这样需要同时运行 CRM、项目管理、自动化工作流、数据分析等 207 个模块的全能业务平台,每天处理海量 SELECT 查询的能力直接取决于这些缓存层的健康程度。

对于正在快速成长的团队来说,在扩展硬件之前首先优化缓存策略,往往能以极低的成本获得数倍的性能提升。

常见问题

查询缓存和缓冲池的本质区别是什么?

查询缓存存储的是完整的查询结果集——对于完全相同的查询可以跳过所有计算直接返回结果,但任何相关表的写入操作都会使其失效。缓冲池存储的是原始数据页和索引页,它为所有查询提供底层数据的快速访问,且不会因单次写入而大面积失效。在写入频繁的业务场景中,缓冲池的稳定性远优于查询缓存。

如何判断我的数据库缓存配置是否合理?

首先检查缓冲池命中率(在 MySQL 中可通过 SHOW ENGINE INNODB STATUS 查看),目标值应在 99% 以上。其次监控磁盘 I/O 等待时间(iowait),如果该值持续偏高,通常意味着缓冲池容量不足。最后,通过 free -h 观察系统可用内存和页缓存使用情况,确保操作系统有足够内存维护页缓存。

使用 SaaS 平台是否还需要关心数据库缓存?

如果您使用的是成熟的 SaaS 平台(如 Mewayz),平台团队已经在基础设施层面完成了这些优化,用户无需自行配置数据库缓存。这正是选择托管平台的核心优势之一——您可以专注于业务增长,将技术复杂性交给专业团队处理。对于中小型团队而言,自行维护和优化数据库缓存的时间成本远高于直接使用已经优化好的平台。

停止为基础设施操心,专注于业务本身。
Mewayz 提供 207 个业务模块,从 CRM 到自动化工作流一应俱全,所有底层性能优化已为您就绪。

免费开始使用 Mewayz →

免费试用 Mewayz

集 CRM、发票、项目、人力资源等功能于一体的平台。无需信用卡。

相关指南

人力资源管理指南 →

有效管理您的团队:员工档案、请假管理、薪资和绩效评估。

立即开始更智能地管理您的业务

加入 30,000+ 家企业使用 Mewayz 专业开具发票、更快收款并减少追款时间。无需信用卡。

觉得这有用吗?分享一下。

准备好付诸实践了吗?

加入30,000+家使用Mewayz的企业。永久免费计划——无需信用卡。

开始免费试用 →

准备好采取行动了吗?

立即开始您的免费Mewayz试用

一体化商业平台。无需信用卡。

免费开始 →

14 天免费试用 · 无需信用卡 · 随时取消