MySQL 百万级深分页优化
延迟关联 + 反向读,末页从 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 去掉:关联列都是主键,对计数没有任何影响。
评论0





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