SELECT * FROM huge_table WHERE condition ORDER BY id LIMIT 1000000, 20;
MySQL 需掃描並丟棄前 1,000,000 行,**IO 與 CPU 雙重浪費**,深分頁極慢。
SELECT id FROM huge_table WHERE condition ORDER BY id LIMIT 1000000(只取 ID,覆蓋索引極快)。CREATE TEMPORARY TABLE page_cache (page_no INT, ids TEXT),分頁號存儲對應 ID 列表(逗號分隔)。List allIds ,按頁切片。SELECT * FROM huge_table WHERE id IN (ids_of_page_N),**主鍵精確點查,毫秒級返回**。created_at 定時清理;Session 靠超時自動失效;Redis 設 TTL。max_allowed_packet 限制,超大分頁可分批 IN 或用 JOIN 臨時表。| 方案 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| 原生 LIMIT | 掃描丟棄 | 簡單 | 深分頁極慢 |
| 延遲關聯 | 子查詢只取 ID 再 JOIN | 無額外存儲 | 仍需掃描 OFFSET 行 |
| 游標/Keyset 分頁 | WHERE id > last_id LIMIT N | 無偏移掃描,極快 | 不支持隨機跳頁 |
| ID 列表緩存 (本文) | 預計算全量 ID,IN 查詢 | 隨機跳頁極快 | 首次慢、佔內存、數據變更需刷新 |