| 寫法 | 含義 | 等價形式 |
|---|---|---|
LIMIT 2 OFFSET 1 | 跳過 1 行,取 2 行 | LIMIT 1, 2 |
LIMIT 2, 1 | 跳過 2 行,取 1 行 | LIMIT 1 OFFSET 2 |
LIMIT 100, -1 | 從第 100 行取到最後 | MySQL 擴展語法 |
LIMIT 15 | 取前 15 行 | LIMIT 0, 15 |
易混淆點:LIMIT offset, count 中 offset 先、count 後;LIMIT count OFFSET offset 關鍵字明確。
SELECT * FROM yanxue8_visit LIMIT 10000, 10; -- 掃描 10010 行,丟棄 10000 行
SELECT * FROM yanxue8_visit LIMIT 0, 10; -- 僅掃描 10 行
偏移量越大,被丟棄的行越多,IO 與 CPU 浪費指數級增長。
SELECT * FROM yanxue8_visit
WHERE vid >= (SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1)
LIMIT 10;
Using index
SELECT * FROM yanxue8_visit AS t1
JOIN (SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1) AS t2
ON t1.vid = t2.vid
LIMIT 10;
| 偏移量 | 原生 LIMIT | 延遲關聯 | 提升 |
|---|---|---|---|
| 10 | 0.0004~0.0005s | 0.0005~0.0006s | 持平(子查詢開銷略大) |
| 10000 | 0.0187s | 0.0061s | **3 倍** |
結論:小偏移原生更優;大偏移延遲關聯碾壓,且偏移越大優勢越明顯。
-- 首頁
SELECT * FROM t ORDER BY id DESC LIMIT 20;
-- 記住最後一行 id = 1000
-- 下一頁
SELECT * FROM t WHERE id < 1000 ORDER BY id DESC LIMIT 20;
SELECT SQL_CALC_FOUND_ROWS * FROM tbl WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS(); -- 總行數
LIMITSQL_CALC_FOUND_ROWS