分頁查詢優化
阿新 • • 發佈:2022-04-07
優化概述
分頁查詢優化可以從如下2個維度來做:
1.設計層面
2.SQL層面
設計層面
產品設計時,介面上不要顯示總數,只顯示頁碼,如:“上一頁 1 2 3 下一頁”。
將具體的頁數換成“下一頁”按鈕,假設每頁顯示20條記錄,那麼每次查詢時都是用LIMIT返回21條記錄並只顯示20條,如果第21條存在,那麼就顯示“下一頁”按鈕。
先獲取並快取較多的資料(例如1000條),然後每次分頁都從快取中獲取。這樣做可以讓應用程式根據結果集的大小採取不同策略,如果結果集少於1000,就可以在頁面上顯示所有的分頁連線;如果結果集大於1000,則可以在頁面上設計一個額外的“找到的結果多於1000條”之類的按鈕。
SQL層面
優化思路:
(1)儘可能使用索引覆蓋掃描,而不是查詢所有的列,然後根據需要做一次關聯操作再返回所需的列(延遲關聯)
(2)將limit查詢轉換為已知位置的查詢,讓mysql通過範圍掃描獲得對應的結果(範圍掃描)
具體實踐:
(1)不要使用簡單的分頁查詢方式直接到資料庫查詢,如:SELECT * FROM order LIMIT 100000, 10
(2)如果主鍵ID連續遞增(沒有資料記錄被物理刪除的情況下可以保證),根據主鍵ID按範圍查詢優化:
SELECT * FROM order WHERE id > 100000 AND id <= 100010 ORDER BY id;
或者
SELECT * FROM order WHERE id > 100000 LIMIT 10 ORDER BY id;
或者
SELECT * FROM order WHERE id >= (SELECT id FROM order ORDER BY id limit 100000,1) limit 0,10;
(3)如果主鍵ID不連續,可以使用如下優化方式
- 子查詢優化
SELECT * FROM WHERE id IN (SELECT id FROM order ORDER BY id LIMIT 100000, 10) ORDER BY id;
- 延遲關聯優化
SELECT * FROM order INNER JOIN (SELECT id FROM order LIMIT 100000,10) AS lim USING(id);