MySQL 8.0 已移除查询缓存,主流优化转向 InnoDB 缓冲池、操作系统页缓存及应用层缓存;需合理配置缓冲池大小与实例数、利用 OS 缓存、引入 Redis 等应用层缓存,并调整相关参数提升内存效率。

MySQL 的缓存机制对性能提升有明显作用,但需注意:官方从 MySQL 8.0 起已移除查询缓存(Query Cache),因此当前主流优化方向是合理利用 InnoDB 缓冲池、操作系统 缓存及应用层缓存。下面从可用缓存类型、配置要点和实用建议三方面说明。
InnoDB 缓冲池(Buffer Pool)是核心缓存
InnoDB 表数据和索引的读写主要依赖缓冲池,它把磁盘上的 热点 页加载到内存中,大幅减少 I/O。配置不当会导致内存浪费或频繁换页。
- 设置足够大但不过度:通常设为物理内存的 50%–75%,例如 16GB 内存服务器可设
innodb_buffer_pool_size = 12G - 启用多实例提升并发:当缓冲池 > 1GB 时,建议拆分为多个实例(如
innodb_buffer_pool_instances = 8),避免争用锁 - 预热常用数据:重启后可通过
SELECT * FROM table_name INTO DUMPFILE '/dev/null'或使用innodb_buffer_pool_load_at_startup=ON加载上次快照
操作系统页缓存(Page Cache)也参与加速
即使未命中 Buffer Pool,InnoDB 读取数据页时仍会经过 OS 缓存。尤其对临时表、日志文件、非 InnoDB 引擎(如 MyISAM)更依赖它。
- 确保系统有足够空闲内存供 OS 缓存使用,避免被其他进程挤占
- 禁用
innodb_flush_method=O_DIRECT时,InnoDB 会绕过 OS 缓存;若开启,则需更依赖 Buffer Pool,此时务必配足innodb_buffer_pool_size - 对只读或低频更新场景,可适当增大
read_buffer_size和sort_buffer_size,但不宜全局设高,应按需在会话中调整
应用层缓存比数据库内置缓存更可控
由于 Query Cache 已废弃且存在锁竞争、失效粒度粗等问题,推荐在业务逻辑中引入 Redis、Memcached 或本地缓存(如 Caffeine)。
- 缓存高频读、低频写的查询结果,例如用户资料、商品分类、配置项
- 用“先更新 DB,再删缓存”策略保证一致性,避免双写失败导致脏数据
- 对复杂查询结果,可缓存中间聚合值(如统计总数、最新 10 条),而非整张表
其他影响缓存效率的关键配置
一些参数虽不直接叫“缓存”,但显著影响内存利用效率:
-
innodb_log_file_size:日志文件越大,Checkpoint 频率越低,间接减少刷脏页压力 -
innodb_old_blocks_pct和innodb_old_blocks_time:控制 LRU 链表冷热分离,防止全表扫描污染热数据 -
table_open_cache:缓存表定义和 .frm 文件(MySQL 5.7 及以前),避免反复打开表结构;8.0 后元数据统一存于 data dictionary,该参数重要性下降