首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL LIMIT 分頁優化深度解析:偏移量大時的高效查詢策略

     編輯:MySQL 綜合教學

MySQL LIMIT 分頁優化深度解析:偏移量大時的高效查詢策略

LIMIT 基本語法

LIMIT [offset,] row_count
LIMIT row_count OFFSET offset
  • offset:跳過的行數(從 0 開始)
  • row_count:返回最大行數
  • LIMIT 5 等價於 LIMIT 0,5
  • LIMIT 95,-1:從第 96 行到末尾(-1 表示無上限)

大偏移量性能問題

LIMIT 100000, 10 需掃描前 100000 行再丟棄,IO 與 CPU 淨浪費。偏移量越大越慢。

優化方案對比實測

測試表:yanxue8_visit,主鍵 vid,10萬+ 行

方案SQL偏移 10 耗時偏移 10000 耗時原理
直接 LIMITSELECT * FROM t LIMIT 10000, 100.0004s0.0187s掃描 10010 行,丟棄 10000 行
子查詢定位 + 覆蓋索引SELECT * FROM t WHERE vid >= (SELECT vid FROM t ORDER BY vid LIMIT 10000, 1) LIMIT 100.0006s0.0061s (3倍快)子查詢只掃描主鍵索引定位 vid,主查詢範圍查詢
延遲關聯SELECT t.* FROM t INNER JOIN (SELECT vid FROM t ORDER BY vid LIMIT 10000, 1) AS d USING (vid) LIMIT 10-~0.006s同上,JOIN 寫法
記住上次最大 ID (游標分頁)SELECT * FROM t WHERE vid > 100000 ORDER BY vid LIMIT 10-0.0003s無偏移,直接範圍查詢,最快

各方案適用場景

  1. 小偏移量(< 1000):直接 LIMIT offset, N 簡單可維護
  2. 大偏移量、傳統分頁(需跳頁):子查詢定位 / 延遲關聯,利用覆蓋索引
  3. 無限滾動、API 分頁(無需跳頁):游標分頁(記住上次最大 ID/時間戳),性能最優、無深分頁問題
  4. 按非主鍵排序分頁:建立聯合索引 (sort_col, pk),子查詢選 pk 回表

優化模板

方案 A:子查詢定位(通用)
SELECT * FROM `table`
WHERE `id` >= (
    SELECT `id` FROM `table`
    ORDER BY `id` LIMIT 100000, 1
)
LIMIT 20;
方案 B:延遲關聯(JOIN 寫法,優化器更穩定)
SELECT t.* FROM `table` t
INNER JOIN (
    SELECT `id` FROM `table`
    ORDER BY `id` LIMIT 100000, 1
) d USING (`id`)
LIMIT 20;
方案 C:游標分頁(推薦 API/無限滾動)
-- 首頁
SELECT * FROM `table` ORDER BY `id` LIMIT 20;

-- 下一頁(客戶端傳遞上次最大 id=10020)
SELECT * FROM `table` WHERE `id` > 10020 ORDER BY `id` LIMIT 20;

注意事項

  • 子查詢 LIMIT offset, 1 仍需掃描 offset 行,但只讀主鍵索引(覆蓋索引),比回表快得多
  • OFFSET 關鍵字僅為語法糖,性能無差異
  • MySQL 8.0+ LIMIT ... OFFSET ... 支援準備語句參數化
  • 分庫分表場景,全局分頁極其複雜,建議業務層面避免深分頁

對比:SQL Server TOP vs MySQL LIMIT

SQL Server TOP N 必須掃描前 N 行,無偏移語法;MySQL LIMIT offset, N 靈活但大偏移慢。現代應用優先游標分頁。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved