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

三大資料庫高效分頁查詢寫法對比:Oracle、SQL Server、MySQL

     編輯:MySQL 綜合教學

分頁查詢效能核心原則

  • 避免大 OFFSET:LIMIT 100000, 20 需掃描 10 萬列再丟棄
  • 利用索引順序:游標/Keyset 分頁(WHERE id > last_id ORDER BY id LIMIT 20)為最佳
  • 只取所需欄位:SELECT * 增加 I/O 與網路傳輸

各資料庫推薦寫法

Oracle(12c+ 原生支援)

-- 12c+ 標準語法(最佳)
SELECT * FROM (
    SELECT t.*, ROW_NUMBER() OVER (ORDER BY id) rn
    FROM my_table t
    WHERE status = 1
) WHERE rn BETWEEN 11 AND 20;

-- 11g 相容寫法
SELECT * FROM (
    SELECT a.*, ROWNUM rn FROM (
        SELECT * FROM my_table WHERE status = 1 ORDER BY id
    ) a WHERE ROWNUM <= 20
) WHERE rn >= 11;

SQL Server(2012+ 原生支援)

-- 2012+ 標準語法(最佳)
SELECT id, name, created_at
FROM my_table
WHERE status = 1
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

-- 2005/2008 雙重 TOP 反轉法
SELECT TOP 10 * FROM (
    SELECT TOP 20 * FROM my_table WHERE status = 1 ORDER BY id ASC
) AS t ORDER BY id DESC;

MySQL(8.0+ 視窗函數 / 5.7 游標法)

-- 8.0+ 視窗函數(推薦)
SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) rn
    FROM my_table WHERE status = 1
) t WHERE rn BETWEEN 11 AND 20;

-- 通用高效游標法(所有版本)
-- 第一頁
SELECT id, name, created_at FROM my_table WHERE status = 1 ORDER BY id LIMIT 10;
-- 後續頁(記住上一頁最大 id)
SELECT id, name, created_at FROM my_table WHERE status = 1 AND id > 1000 ORDER BY id LIMIT 10;

效能對比總結

資料庫版本推薦語法大偏移量效能
Oracle12c+ROW_NUMBER() OVER優(視窗函數最佳化)
SQL Server2012+OFFSET/FETCH優
MySQL8.0+ROW_NUMBER() OVER優
MySQL5.7/5.6游標法 (WHERE id > ?)優(需應用層記住游標)
MySQL所有LIMIT offset, size差(線性掃描)

遷移建議

  1. 新專案直接使用標準語法(OFFSET/FETCH、ROW_NUMBER)
  2. 舊專案逐步重構游標法,移除大 OFFSET 查詢
  3. 分頁介面改為「下一頁/載入更多」模式,天然適配游標法
  4. 確保排序欄位有索引,複合索引覆蓋 WHERE + ORDER BY

掌握各資料庫原生分頁語法與游標法精髓,即可在任何量級下實現毫秒級分頁響應。

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