MySQL LIMIT M, N 深分頁(大 M)性能極差:需掃描丟棄前 M 行。隨數據量增長,響應時間線性惡化。本文總結六種優化方案並點評優劣。
SELECT * FROM table_name LIMIT M, N
ORDER BY 時結果集順序不穩定。SELECT * FROM table_name WHERE id_pk > (pageNum * pageSize) LIMIT M
SELECT * FROM table_name
WHERE id_pk > (pageNum * pageSize)
ORDER BY id_pk ASC
LIMIT M
ORDER BY 列為主鍵/唯一索引時,MySQL 可消除排序操作,結果集穩定。ORDER BY ... DESC 無法利用索引倒序掃描(8.0+ 已優化),僅支持 ASC 高效利用索引。PREPARE stmt_name FROM
'SELECT * FROM table_name WHERE id_pk > (?, ?) ORDER BY id_pk ASC LIMIT ?';
SET @pageNum = 1, @pageSize = 10, @limit = 10;
EXECUTE stmt_name USING @pageNum, @pageSize, @limit;
SELECT SQL_CALC_FOUND_ROWS * FROM table_name LIMIT M, N;
SELECT FOUND_ROWS();
WHERE id > last_id ORDER BY id LIMIT N,無深分頁問題,適合無限滾動/列表翻頁。SELECT id FROM table WHERE ... ORDER BY id LIMIT M, N 先取 ID,再 WHERE id IN (...) 回表查詳情,減少回表次數。SELECT id FROM table ORDER BY id LIMIT M, N,外層 JOIN 原表取字段。| 方案 | 適用場景 | 性能 | 穩定性 | 維護性 |
|---|---|---|---|---|
| 原生 LIMIT | 極小數據 | 差 | 無 ORDER BY 不穩定 | 高 |
| ID 範圍查詢 | 大數據、ID 連續 | 優 | 依賴 ID 順序 | 高 |
| ID 範圍 + ORDER BY | 大數據、需穩定序 | 優 | 高(ASC) | 高 |
| Prepared Statement | 高頻分頁 | 優+ | 高 | 中 |
| 存儲過程 | 極致性能追求 | 優+ | 高 | 低 |
| SQL_CALC_FOUND_ROWS | 無 | 差 | 高 | 高 |