100 萬 URL 去重,需分頁載入記憶體。LIMIT offset, 500 隨著 offset 增大極慢:
LIMIT 0,500 ~5msLIMIT 88500,500 ~8 秒EXPLAIN 顯示 type=index 但 rows=1000000,MySQL 實際掃描並丟棄前 88500 行。
記住上一頁最大 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,完美解決分頁效能退化。