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

SQL Server TOP vs MySQL LIMIT 分頁語法差異與遷移指南

     編輯:MySQL 綜合教學

核心語法對比

功能SQL Server (T-SQL)MySQLPostgreSQL / Oracle 12c+
前 N 行SELECT TOP (N) * FROM tbl ORDER BY id;SELECT * FROM tbl ORDER BY id LIMIT N;SELECT * FROM tbl ORDER BY id FETCH FIRST N ROWS ONLY;
跳過 M 行取 N 行 (分頁)SELECT * FROM tbl ORDER BY id OFFSET M ROWS FETCH NEXT N ROWS ONLY; (2012+)SELECT * FROM tbl ORDER BY id LIMIT N OFFSET M; 或 LIMIT M, NSELECT * FROM tbl ORDER BY id OFFSET M LIMIT N;
帶變量參數化OFFSET @offset ROWS FETCH NEXT @page_size ROWS ONLYLIMIT ?, ? (Prepared Statement)同標準

分頁實戰:從第 4 條取 3 條 (第 2 頁, 每頁 3 條)

-- SQL Server 2012+
SELECT * FROM users ORDER BY user_id OFFSET 3 ROWS FETCH NEXT 3 ROWS ONLY;

-- MySQL / MariaDB / PostgreSQL / SQLite
SELECT * FROM users ORDER BY user_id LIMIT 3 OFFSET 3;
-- 或 MySQL 專用簡寫
SELECT * FROM users ORDER BY user_id LIMIT 3, 3;  -- OFFSET, COUNT

深度分頁性能陷阱 (兩者通病)

OFFSET 1000000 LIMIT 10 要求引擎**掃描並丟棄前 100 萬行**,隨著偏移量增大線性變慢。

優化方案 (通用)

  1. Keyset Pagination (游標分頁):記住上一頁最後一行的排序鍵值,WHERE (sort_col, pk) > (last_sort, last_pk) ORDER BY sort_col, pk LIMIT N。**無 OFFSET 掃描,深翻頁性能恆定**。
  2. 覆蓋索引 + 子查詢定位 (MySQL):
    SELECT * FROM tbl
    WHERE id >= (SELECT id FROM tbl ORDER BY id LIMIT 1000000, 1)
    ORDER BY id LIMIT 10;

    子查詢只掃描索引定位起始 ID,外層主鍵範圍查詢極快。

  3. 延遲關聯:SELECT * FROM tbl INNER JOIN (SELECT id FROM tbl ORDER BY id LIMIT 1000000, 10) t2 USING (id) — 內層只掃描索引取 ID,外層回表少量行。

遷移檢查清單

  • 語法替換:TOP (N) → LIMIT N;OFFSET ... FETCH → LIMIT ... OFFSET ...。
  • ORDER BY 必須性:無 ORDER BY 的分頁結果**不確定**,兩者皆要求。**遷移時補全業務唯一排序鍵**。
  • TOP 與 TIES:TOP (N) WITH TIES 保留並列值,MySQL 無直接對應,**需窗口函數** RANK() OVER (ORDER BY ...) <= N (8.0+)。
  • PERCENT:TOP (10) PERCENT,MySQL 需計算總數 COUNT(*) * 0.1 再 LIMIT。
  • 驅動程序參數綁定:JDBC setMaxRows 對應 LIMIT,但分頁仍需手寫 LIMIT ?, ?。

總結

TOP (SQL Server) / FETCH (標準) / LIMIT (MySQL/PG) 核心邏輯一致:**排序 + 截取**。分頁核心痛點在 **OFFSET 掃描**,跨數據庫通用優化鍵是 **Keyset Pagination** 或 **覆蓋索引定位**。遷移時注意 ORDER BY 完整性、WITH TIES 等高級特性的功能對等實現。

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