首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL LIMIT 子句實現 Top N 與 M 到 N 分頁查詢

     編輯:MySQL 資料庫相關知識

語法核心

SELECT * FROM mytable
ORDER BY afield
LIMIT offset, row_count;
  • offset:跳過的筆數(從 0 開始),第 M+1 筆對應 offset = M。
  • row_count:要取回的筆數。

常見模式

需求SQL 範例說明
Top 10 SELECT * FROM t ORDER BY score DESC LIMIT 10 LIMIT 10 等同 LIMIT 0, 10
第 3-7 筆(共 5 筆) SELECT * FROM t ORDER BY id LIMIT 2, 5 跳過前 2 筆,取 5 筆
第 N 頁,每頁 20 筆 SELECT * FROM t ORDER BY id LIMIT (N-1)*20, 20 應用層計算 offset

效能陷阱與優化

深分頁問題

LIMIT 1000000, 20 會掃描 1,000,020 筆再丟棄前 1M 筆,隨著 offset 增大速度線性下降。

優化策略

  1. 延遲關聯:
    SELECT t.*
    FROM t
    INNER JOIN (SELECT id FROM t ORDER BY id LIMIT 1000000, 20) tmp USING (id)
    ORDER BY t.id;
    
    只在索引上掃描 offset,再回表取欄位。
  2. 游標/Keyset 分頁:記住上一頁最大 id,改用 WHERE id > last_id ORDER BY id LIMIT 20,適合無限滾動、不需跳頁場景。
  3. 覆蓋索引:INDEX (sort_col, id) INCLUDE (col1, col2...) 讓查詢完全在索引完成。

版本差異提醒

  • MySQL 8.0+ 支援 LIMIT ... OFFSET ... 標準語法,與 LIMIT offset, count 等價。
  • MariaDB 10.6+ 引入 OFFSET ... LIMIT ... 可互換順序。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved