LIMIT m,n 的深分頁效能崩塌有索引時 LIMIT m,n 較快,但複雜條件(如 WHERE ... ORDER BY field1+field2)會導致 MySQL 全表掃描、產生臨時表、檔案排序,再取出 m,n 行。數十萬資料、通用關鍵字搜尋、使用者翻至末頁時,磁碟 I/O 飆升、回應極慢。
核心邏輯:先查出符合條件的主鍵 ID 陣列,分頁時僅按 ID 列表精準回查,避免重複複雜排序。
SELECT id FROM `table` WHERE $condition ORDER BY $field LIMIT $max_pages*$page_size;
可限制最大回傳行數,控制記憶體佔用。page_1 ... page_n 欄位存分頁 ID,加 token (時間/隨機數) 做查詢標識,定時清理過期資料。$IDs[token][page_num] 存入 Session(檔案/記憶體),同樣需設定 TTL 清理。SELECT * FROM `table` WHERE id IN ($ids_csv);
IN 列表查詢極快,且不受 OFFSET 影響。created_at 定時刪除;Session 依賴 GC 機制或自訂 Cron 清理。SELECT ... INTO TEMP TABLE 合併步驟 1/2,減少網路往返。CURSOR / WINDOW FUNCTION。ROW_NUMBER()、OFFSET/FETCH)。拋磚引玉,歡迎共同探討更優雅的分頁架構。