復雜條件分頁 WHERE ... ORDER BY ... LIMIT m,n 在大數據量下極其低效:MySQL 必須全表掃描找出所有符合條件的行,排序後再截取第 m 到 n 行。若用戶翻到末頁,IO 與 CPU 消耗巨大。
將「查找符合條件的 ID」與「按 ID 取詳情」分離,利用 ID 列表實現 O(1) 翻頁。
SELECT id FROM table WHERE condition ORDER BY field LIMIT max_pages * page_size;search_cache_,字段 page_1, page_2, ... 存各頁 ID 列表(逗號分隔),帶 created_at 字段定期清理過期緩存。$_SESSION['search_ids'][token][page] = $ids,或序列化到文件。需為並發搜索生成唯一 token(時間戳+隨機數)避免覆蓋。SELECT * FROM table WHERE id IN (id1,id2,...);created_at > 30min 的臨時表/Session 文件;或按比例隨機清理(如 1% 請求觸發掃描)。SELECT ... INTO OUTFILE ... 或 INSERT INTO cache_table SELECT ... 直寫緩存。IN 列表過長(>1000)可能影響性能,分批查詢或使用臨時表 JOIN。token。