在實際場景中會遇到這樣的一種情況:資料量很大,而且還要分頁查詢,如果資料量達到百萬級別之後,效能會急劇下降,導致查詢時間很長,甚至是超時。接下來我總結了兩種常用的優化方案,僅供參考。但是需要注意的是有個前提:主鍵id是遞增且資料有序。
1:使用子查詢優化
這種方式先定位偏移位置的 id,然後往後查詢,這種方式適用於 id 遞增的情況。sql如下圖所示:
1select2*
3from
4orders_history
5where
6 type =87
and id >= ( select id from orders_history where type =
8 limit 100000, 1
) 8 limit 100;
2:使用id限定優化
這種方式假設資料表的id是連續遞增的,則我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的範圍,可以使用id between and 來查詢。sql如下圖所示:
1select2*
3from
4orders_history
5where
6 type =27
and id between
1000000
8and
1000100
9 limit 100;
還可以有另外一種寫法,sql如下圖所示:
select*from orders_history where id >=
1000001 limit 100;
總結:這種查詢方案的前提條件已經說過了,主鍵遞增且資料有序。其實就是利用b+樹的原理進行的,因為在innodb儲存引擎中,資料是通過b+樹進行儲存,葉子節點儲存的是主鍵id,另外子查詢中也用到了覆蓋索引。一般查詢條件排序條件為按照主鍵id遞增,或者是遞減,查詢偏移起始位置是經過計算之後,帶入到sql中的。如果資料量實在是太大了,如果達到千萬級別的話,哈哈哈,我建議還是使用分庫分表元件吧,比如apache shardingsphere、mycat等開源元件。
大資料量分頁優化
用limit offset 時並不是先跳過再查詢 而是 先查詢,再跳過 limit 100w,10 先把100w取出來,然後跳過前100w行,所以大資料分頁用limit很慢 select id,name from lx com 5000000,10 先查詢出來5000000 select id,na...
mysql大資料量分頁查詢優化
參考文章 mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 盡...
mysql大資料量分頁查詢優化
參考文章 mysql的分頁查詢十分簡單,但是當資料量大的時候一般的分頁就吃不消了。傳統分頁查詢 select c1,c2,cn from table limit n,m mysql的limit工作原理就是先讀取前面n條記錄,然後拋棄前n條,讀後面m條想要的,所以n越大,偏移量越大,效能就越差。1 盡...