MySQL无内置统计缓存,但可通过汇总表预计算、Redis缓存聚合结果、触发器维护统计字段等方式实现;需重点保障缓存与源数据一致性。
MySQL 中不直接提供“统计缓存”功能,但可以通过合理设计,在应用层或数据库层实现高效、可控的统计结果缓存,避免每次查询都实时聚合大量数据。核心思路是:把耗时的 GROUP BY、COUNT、SUM 等聚合结果预先算好、存起来,并在数据变更时及时更新。
这是最常用也最可靠的方式:单独建一张表,只存统计结果,比如用户每日订单数、商品总销量等。
INSERT INTO summary_orders SELECT DATE(create_time), COUNT(*), SUM(amount) FROM orders WHERE create_time >= 'yesterday' GROUP BY DATE(create_time)
summary_orders,毫秒级响应(date) 或 (date, status)),查询极快UPDATE summary_orders SET count = count + 1 WHERE date = CURDATE())适合变化不频繁、但查询非常频繁的统计场景,比如首页显示“当前在线用户数”“热门文章 TOP10”。
时,主动失效或更新 Redis 中对应 key,避免脏数据SET stat:online_users 12412487 EX 1800 或 ZADD stat:hot_articles 98.5 "article:1024"
适用于强一致性要求高、统计维度简单(如单条记录关联的计数)的场景,比如“每个分类下的文章数”。
categories 中增加 post_count INT DEFAULT 0 字段posts 上创建 INSERT/DELETE 触发器,自动增减对应分类的 post_count
SELECT id, name, post_count FROM categories,无需 JOIN 或子查询MySQL 5.7 及以前版本曾支持 Query Cache,对相同 SELECT 自动缓存结果。但8.0 版本已完全移除,且实际中问题较多:
不复杂但容易忽略的是缓存与源数据的一致性保障。无论选哪种方式,都要明确“谁负责更新”“什么时候更新”“失败怎么兜底”,否则缓存就成了 bug 温床。