首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

百萬級 MySQL 分頁查詢優化:從 LIMIT 偏移量陷阱到索引順序逆襲

     編輯:MySQL 資料庫相關知識

問題現場

100 萬 URL 去重,需分頁載入記憶體。LIMIT offset, 500 隨著 offset 增大極慢:

  • LIMIT 0,500 ~5ms
  • LIMIT 88500,500 ~8 秒

EXPLAIN 顯示 type=index 但 rows=1000000,MySQL 實際掃描並丟棄前 88500 行。

優化關鍵:用 WHERE 取代 OFFSET

記住上一頁最大 ID,下一頁改用 WHERE id > last_max_id LIMIT 500:


-- 第一頁
SELECT id,url FROM urlmd5 WHERE siteid=0 ORDER BY id LIMIT 500;
-- 記錄最大 id = 1000
-- 第二頁
SELECT id,url FROM urlmd5 WHERE siteid=0 AND id > 1000 ORDER BY id LIMIT 500;

避免掃描+丟棄,直接定位。

索引順序決定生死

原索引 (siteid, id) 效果不佳。改為 (id, siteid) 後,每頁查詢穩定 **7-10ms**,100 萬資料全量載入 **32 秒**。

原理:B+ 樹第一層分支由索引首欄決定。首欄基數越大 (id 唯一),樹高越矮,查詢越快。siteid 只有 0/1 兩值,放首位導致樹高、掃描範圍大。

完整載入日誌


query time=7 insert time=3
...
siteid=0 load 1000000 url load time=31948

末頁同樣 7ms,完美解決分頁效能退化。

遷移建議

  1. 分頁介面改「下一頁」游標模式,不再支援跳頁
  2. 索引首欄選高基數欄位 (id、建立時間)
  3. 覆蓋索引包含查詢欄位 (id, url, siteid) 可進一步避免回表
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved