LIMIT m, n 是 MySQL 分頁查詢的核心語法,但參數含義常被誤解。本文用直觀示例釐清 m、n 的具體語義,並補充常見分頁優化提示。
SELECT * FROM table LIMIT m, n
m=0 表示從第一條開始。等價寫法:LIMIT n OFFSET m(SQL:2008 標準,可讀性更強)。
mysql> SELECT * FROM total;
+----+-----------------+--------+------------+
| id | name | number | mydate |
+----+-----------------+--------+------------+
| 1 | 河南出版社 | 1000 | 2008-03-24 |
| 2 | 河南出版社 | 1200 | 2009-04-24 |
| 3 | 河南出版社 | 1100 | 2010-04-24 |
| 4 | 河南出版社 | 1400 | 2011-04-24 |
| 5 | 河南出版社 | 1350 | 2012-04-24 |
| 6 | 北京出版社 | 2000 | 2008-03-24 |
| 7 | 北京出版社 | 2020 | 2009-04-24 |
| 8 | 北京出版社 | 2050 | 2010-04-24 |
| 9 | 北京出版社 | 1980 | 2011-04-24 |
| 10 | 北京出版社 | 2100 | 2012-04-24 |
+----+-----------------+--------+------------+
LIMIT 2, 3mysql> SELECT * FROM total LIMIT 2, 3;
+----+-----------------+--------+------------+
| id | name | number | mydate |
+----+-----------------+--------+------------+
| 3 | 河南出版社 | 1100 | 2010-04-24 |
| 4 | 河南出版社 | 1400 | 2011-04-24 |
| 5 | 河南出版社 | 1350 | 2012-04-24 |
+----+-----------------+--------+------------+
解析:跳過前 2 條(id 1、2),取後續 3 條(id 3、4、5)。
| 頁碼 (page, 1-based) | 每頁大小 (size) | LIMIT 寫法 |
|---|---|---|
| 1 | 10 | LIMIT 0, 10 或 LIMIT 10 |
| 2 | 10 | LIMIT 10, 10 |
| k | size | LIMIT (k-1)*size, size |
效能陷阱: 深分頁(如 LIMIT 1000000, 10)會掃描並丟棄前 100 萬行,極慢。
優化方案:
SELECT * FROM t INNER JOIN (SELECT id FROM t LIMIT 1000000, 10) tmp USING(id)WHERE id > last_max_id ORDER BY id LIMIT 10(需 ID 連續遞增)LIMIT m, n 與 LIMIT n OFFSET m。OFFSET m ROWS FETCH NEXT n ROWS ONLY。ORDER BY col OFFSET m ROWS FETCH NEXT n ROWS ONLY。掌握 LIMIT 語義與優化策略,是編寫高效分頁查詢的基礎功。