背景
在后端開發中,為了防止一次加載過多的數據造成過多的內存和磁盤IO開銷,往往需要按頁顯示。此時,需要使用MySQL的limit關鍵字。當存在大量數據時,最可能由限制引起的問題之一是深度分頁。
Mysql深度分頁第一式:復用
分頁查詢的特性決定了它可以有效利用上一次查詢的結果,舉例:
select id, name, address, phone
FROM customers
WHERE id > 990
ORDER BY id LIMIT 10;
通過where條件來縮小查詢范圍,當然不是每個查詢都有id做where條件,但也可以使用其他條件:
SELECT id, username
FROM customers
WHERE username > ‘shull@iheavy.com’
ORDER BY username LIMIT 10;
不一定好用!
Mysql深度分頁第二式:延遲聯接
如果想要查詢第99頁:
SELECT id, name, address, phone FROM customers ORDER BY name LIMIT 10 OFFSET 990;
那么可以試試:
SELECT id, name, address, phone
FROM customers
INNER JOIN (
SELECT id
FROM customers
ORDER BY name
LIMIT 10 OFFSET 990)
AS my_results USING(id);
Mysql深度分頁第三式:維護一個頁或者位置列
維護一個頁列
SELECT id, name, address, phone
FROM customers
WHERE page = 100
ORDER BY name;
維護一個位置列
SELECT id, name, address, phone
FROM customers
WHERE place BETWEEN 990 AND 999
ORDER BY name;
麻煩的是,當您(a)插入一行(b)刪除一行(c)使用update移動一行時,您需要更新該列。這可能會讓頁面變得凌亂。
參考資料
【1】
https://www.iheavy.com/2013/06/19/3-ways-to-optimize-for-paging-in-mysql/