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

MySQL LIMIT 大偏移量效能優化:子查詢鎖定 ID 範圍避免全表掃描

     編輯:PHP 綜合知識

問題現象

同樣取 10 筆資料:

  • SELECT * FROM yanxue8_visit LIMIT 0,10 → 耗時 0.0004~0.0005 秒
  • SELECT * FROM yanxue8_visit LIMIT 10000,10 → 耗時 0.0187 秒(慢 40 倍)

原因:MySQL 需先掃描並捨棄前 10000 列,再取後 10 列,偏移量越大效能越差。

優化策略:先查 ID 再回表

SELECT * FROM yanxue8_visit
WHERE vid >= (
    SELECT vid FROM yanxue8_visit ORDER BY vid LIMIT 10000, 1
)
LIMIT 10;
  • 子查詢僅掃描索引(vid 主鍵)定位第 10001 筆的 ID,極快。
  • 外層查詢直接用 WHERE vid >= ... LIMIT 10 回表取資料,避免大偏移掃描。

實測數據對比(Win2003 + P4雙核 3GHz + 4GB RAM + MySQL 5.0.19)

查詢方式OFFSET=10OFFSET=10000
直接 LIMIT0.0004~0.0005 秒0.0187 秒
子查詢優化0.0005~0.0006 秒0.0061 秒(快 3 倍)

結論與建議

  • 小偏移量(< 1000):直接 LIMIT 即可,子查詢反而略慢。
  • 大偏移量:採用「子查詢鎖定起始 ID + 回表 LIMIT」模式,效能提升顯著,偏移量越大優勢越明顯。
  • 前提:表需有遞增主鍵或唯一索引(如 vid),且查詢順序與索引順序一致。
  • 分頁系統建議:記錄「上一頁最大 ID」,下一頁直接 WHERE id > $last_id LIMIT 10,完全避免 OFFSET。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved