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

MySQL LIMIT 分頁查詢完全指南:語法、偏移量陷阱與大數據優化

     編輯:MySQL 綜合教學

MySQL LIMIT 分頁查詢完全指南

LIMIT 是分頁、取 Top-N 的核心語法,但大偏移量(如 LIMIT 1000000, 10)會導致全表掃描性能崩塌。本文覆蓋語法變體、偏移量陷阱、優化方案。

語法變體

語法含義等價寫法
LIMIT 5前 5 行LIMIT 0, 5
LIMIT 5, 10第 6~15 行(偏移 5,取 10)LIMIT 10 OFFSET 5
LIMIT 95, -1第 96 行到末尾MySQL 專有,-1 表示無上限

注意: 偏移量從 0 開始,LIMIT 0, 10 取前 10 行。

PostgreSQL 兼容語法

LIMIT 10 OFFSET 5  -- 等同 LIMIT 5, 10

大偏移量性能陷阱

-- 百萬偏移:MySQL 需掃描前 1,000,000 行再丟棄,極慢
SELECT * FROM huge_table LIMIT 1000000, 10;

原理: InnoDB 需按主鍵順序讀取並丟棄前 N 行,IO 與 CPU 雙重浪費。

優化方案對比

方案適用場景核心思路
延遲關聯單表、有主鍵SELECT * FROM t JOIN (SELECT id FROM t LIMIT 1000000, 10) tmp USING(id) 只掃描主鍵索引
游標/Keyset 分頁翻頁、無需跳頁WHERE id > last_seen_id ORDER BY id LIMIT 10 利用索引範圍查詢
覆蓋索引只查索引列索引包含所有 SELECT 列,避免回表
預計算/緩存熱門首頁Redis 緩存首頁數據,翻頁走 DB

實戰建議

  • 後台管理、報表導出:LIMIT offset, rows 可接受(低頻、用戶耐心高)。
  • 用戶面向列表(商品、動態):**強制使用 Keyset 分頁**,前端傳 last_id 或 cursor。
  • 禁止前端傳任意 page/size 直接拼 SQL,必須在服務端轉換為 Keyset 或限制最大頁碼(如 ≤ 1000)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved