limit越往后越慢,如何解決?


問題原因

limit 10000,20意味着掃描滿足條件的10020行,扔掉前面的10000行,返回最后的20行;

查詢數據量和偏移量成正比。

優化方法

游標分頁

也就是前端傳遞last_id的那種做法。弊端是cursor方式分頁只適合用於有順序的數據且不支持跳頁。

利用子查詢或join走覆蓋索引

-- 傳統limit,文件掃描
[SQL]SELECT * FROM tableName ORDER BY id LIMIT 500000,2;
受影響的行: 0
時間: 5.371s

-- 子查詢方式,索引掃描
[SQL]
SELECT * FROM tableName
WHERE id >= (SELECT id FROM tableName ORDER BY id LIMIT 500000 , 1)
LIMIT 2;
受影響的行: 0
時間: 0.274s

-- JOIN分頁方式
[SQL]
SELECT *
FROM tableName AS t1
JOIN (SELECT id FROM tableName ORDER BY id desc LIMIT 500000, 1) AS t2
WHERE t1.id <= t2.id ORDER BY t1.id desc LIMIT 2;
受影響的行: 0
時間: 0.278s

參考

  1. 游標分頁
  2. 利用子查詢或join走覆蓋索引


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM