某論壇回覆表 reply_0004 單執行緒擁有 123 萬條資料,索引為 (thread_id, deleted, id)。查詢最後一頁:
SELECT id FROM reply_0004 WHERE thread_id = 5616385 AND deleted = 0 ORDER BY id ASC LIMIT 1236785, 10;
耗時 1.32 秒。隨著偏移量增大,MySQL 需掃描並丟棄大量前置行,導致延遲線性增長。
B+ 樹索引天然有序,DESC 掃描同樣高效。將「查最後幾頁」改為「反向查前幾頁」再排序:
SELECT * FROM ( SELECT id FROM group_thread_reply_0004 WHERE thread_id = 5616385 AND deleted = 0 ORDER BY id DESC LIMIT 0, 10 ) t ORDER BY t.id ASC;
LATERAL JOIN 或 CTE 寫法更優雅若業務允許,改用 WHERE id < last_seen_id ORDER BY id DESC LIMIT 10 可完全消除 OFFSET 掃描成本,實現真正的 O(1) 分頁。