MySQL 百万级深分页优化

Admin
318阅读
0评论
0点赞

延迟关联 + 反向读,末页从 6s 降到 120ms。

问题

LIMIT 2000000, 10 这类深分页,MySQL 要沿索引白走 200 万行再丢掉。500 万行的表上实测末页要 6 秒。

一、延迟关联

先只在索引上定位本页的主键,再回表取展示字段。

SELECT c.* FROM cms_content c
JOIN (
  SELECT id FROM cms_content ORDER BY created_at DESC LIMIT 2000000, 10
) t ON t.id = c.id;

直接 JOIN 完再排序会让优化器走 hash join 把整个结果集物化,LIMIT 下推不下去(实测 22.5s 降到 292ms)。

二、后半段反向读

OFFSET 的代价是 O(offset)。落在后半段的页改成反向排序、从另一端数同样距离,再把结果倒回来。

前提是两个方向用同一个全序,所以排序必须恒带 id 次序键,否则并列值会错位。

场景 优化前 优化后
首页 22.5s 292ms
末页 5818ms 123ms
COUNT 2.6s 198ms

COUNT 时把展示用的 LEFT JOIN 去掉:关联列都是主键,对计数没有任何影响。

上一篇Hyperf 协程踩坑记下一篇基于Webman的多平台广告管理系统
评论0

暂无评论,期待您的发言...

发表评论