大數據量數據分頁查詢優化方案


在實際場景中會遇到這樣的一種情況:數據量很大,而且還要分頁查詢,如果數據量達到百萬級別之后,性能會急劇下降,導致查詢時間很長,甚至是超時。接下來我總結了兩種常用的優化方案,僅供參考。但是需要注意的是有個前提:主鍵id是遞增且數據有序。

1:使用子查詢優化

這種方式先定位偏移位置的 id,然后往后查詢,這種方式適用於 id 遞增的情況。sql如下圖所示:

1 SELECT
2     * 
3 FROM
4     orders_history 
5 WHERE
6     type = 8 
7     AND id >= ( SELECT id FROM orders_history WHERE type = 8 LIMIT 100000, 1 ) 
8     LIMIT 100;

 2:使用id限定優化

這種方式假設數據表的id是連續遞增的,則我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的范圍,可以使用id between and 來查詢。sql如下圖所示:

1 SELECT
2     * 
3 FROM
4     orders_history 
5 WHERE
6     type = 2 
7     AND id BETWEEN 1000000 
8     AND 1000100 
9     LIMIT 100;

還可以有另外一種寫法,sql如下圖所示:

select * from orders_history where id >= 1000001 limit 100;

總結:這種查詢方案的前提條件已經說過了,主鍵遞增且數據有序。其實就是利用B+樹的原理進行的,因為在Innodb存儲引擎中,數據是通過B+樹進行存儲,葉子節點存儲的是主鍵id,另外子查詢中也用到了覆蓋索引。一般查詢條件排序條件為按照主鍵id遞增,或者是遞減,查詢偏移起始位置是經過計算之后,帶入到sql中的。如果數據量實在是太大了,如果達到千萬級別的話,哈哈哈,我建議還是使用分庫分表組件吧,比如Apache ShardingSphere、MyCat等開源組件。

 


免責聲明!

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



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