1. 程式人生 > >Mysql limit 分頁機制和優化例項

Mysql limit 分頁機制和優化例項

Mysql limit 操作常用於程式中的分頁,但是如果你沒有了解過limit的機制和相關優化原理,一旦資料量上升,程式的效能將會慘不忍睹,所以下面總結幾種mysql關於limit優化例項,每個例項後對應都會有演示。(演示的資料來自15年暑期實習的p2p流量資料,表資料量約300W行)

1、sql中會範的錯誤

select XXX from tableA  limit 1000000,10;
上面的語句是取1000000後面的10條記錄,但是這樣會導致mysql將1000000之前的所有資料全部掃描一次,大量浪費了時間。截圖是我掃描100W資料花費的時間,大概是2S多


這在程式中肯定是不可忍受的。

對於mysql,優化limit最重要的一點就是儘量先用主鍵id的索引到起始位置,然後再擷取需要的行數。

   2、優化方式

(1)使用記錄主鍵的方式進行優化

     limit最大的問題在於要掃描前面不必要的資料,所以可以先對主鍵的條件做設定,然後記錄住主鍵的位置再取行。

select * from p2p_20131230  where main_id > 1000000 order by main_id  limit 10;
這樣執行的結果如下所示,比沒有優化前提升了很多倍。

     (2)使用子查詢進行查詢:

select * from p2p_20131230 where main_id >= (select main_id from p2p_20131230 limit 1000000,1) limit 10;

    (3) 使用between關鍵字

如果在主鍵id是有序不變的情況下,還可以手動計算between的前後兩個條件進行查詢,這裡我就不上程式碼了。

    總結一下,上面的集中方法都是利用mysql的主鍵索引進行優化,當然應用中通常很難直接獲得索引,基本上都是格局where後的某個條件,這個時候就可以先用條件查詢出主鍵id,然後再用上述方式獲取結果集即可。