1. 程式人生 > >SQL大資料量分頁效能優化

SQL大資料量分頁效能優化

目前在進行web api只讀介面的改造,在改造過程中,發現改在後響應時間和之前區別不是很大,通過測試結果顯示在sql的分頁功能處找到原因,並對其進行優化,優化方案如下。

測試內容

此次執行時間對比採用平臺資金記錄最多的使用者 user_id 36062

測試次數未5次  為避免索引快取每次測試前更改 limit 的起始值,查詢條數10不變。

5次結果取平均值優化前平均查詢時間為0.287s

         優化後 sql1平均查詢時間為0.012s

         優化後 sql2 平均查詢時間為0.016s

結果顯示:優化後的sql1和sql2查詢效率明顯高於優化前。

通過先查詢到所有滿足條件的索引,然後通過索引檢索到所需要的資料,效率提高很多。

附:sql

sql

SELECT  * FROM  account_log WHERE user_id  =  36062ORDER BY id DESC LIMIT 3300, 10;

優化後的sql 1

SELECT * FROM account_log a JOIN ( SELECTid FROM rd_account_log WHERE user_id = 36062 ORDER BY id DESC LIMIT 3300, 10) bON b.id = a.id;

優化有sql 2

SELECT * FROM account_log WHERE user_id =36062 AND id <=(SELECT id FROM rd_account_log

WHERE user_id = 36062 ORDER BY id DESC LIMIT33416,1) LIMIT 10

總結

1、隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關係的;

1)limit語句的查詢時間與起始記錄的位置成正比
2)mysql的limit語句是很方便,但是對記錄很多的表並不適合直接使用。

2、利用表的覆蓋索引來加速分頁查詢
我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那麼這種情況會查詢很快。

因為利用索引查詢有優化演算法,且資料就在查詢索引上面,不用再去找相關的資料地址了,這樣節省了很多時間。另外Mysql中也有相關的索引快取,在併發高的時候利用快取就效果更好了。