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