LIMIT m,n 在複雜條件下的效能崩潰有索引時 LIMIT m,n 較快,但複雜條件(如 WHERE ... ORDER BY field1+field2)會導致 MySQL 全表掃描取出所有符合條件記錄再切片。數十萬資料量下,用戶翻閱尾頁會引發大量磁碟 I/O。
一次性查詢符合條件的主鍵 ID 集合,後續分頁直接按 ID 列表精確取回,避免重複掃描。
SELECT id FROM `$table` WHERE `$condition` ORDER BY `$field` LIMIT $max_pages*$count;
$max_pages * $count),防止記憶體暴增| 方案 | 實作方式 | 優缺點 |
|---|---|---|
| A. MySQL 臨時表 | 建立臨時表,以時間戳/隨機數為唯一標識存入;欄位 page1~pageN 儲存各頁 ID 列表 |
跨請求共享,需定期清理過期表 |
| B. PHP Session | 將二維陣列 $IDs[page][id_list] 存入 $_SESSION(實際落檔) |
輕量簡單,但多視窗並發需唯一標識區分(如二維陣列鍵名或 $$var) |
SELECT * FROM `$table` WHERE id IN ($ids); -- $ids 為逗號分隔的 ID 字串
主鍵查詢極快,徹底解決深分頁效能問題。