天天看點

資料庫分頁性能優化的幾個常用政策

偶然看了幾篇關于資料庫分頁性能優化的文章。概括起來主要有以下幾個政策。

1,緩存結果

緩存有資源消耗,命中率和資料一緻性等問題,其利弊需要根據使用場景進行權衡。

2,利用索引迅速跳過offset之前的記錄

對單個分頁請求來說,一頁的傳回記錄數通常很少,但要跳過的記錄數可能會非常多。如何快速跳過這些offset之前的記錄是優化的關鍵。可以用下面的辦法:

 i,對查詢結果進行排序(比如:order by id)

 ii,排序的列上有索引并且要讓執行計劃使用這個索引

 iii,提供排序的列在該頁中的值範圍以便能讓索引掃描快速定位(比如:id > 10000)

然而如和得到排序的列在該頁中的值範圍呢?兩個辦法,一是在上次查詢時預先存下來,這樣做性能最好,但應用程式必須要一起修改。二是可以用一個子查詢單獨擷取,這個子查詢由于隻需要得到排序列的值而不是所有的細節,是以有可能找到比直接讓主查詢過濾效率更高的執行計劃。

3,減少應用對大offset的分頁需求

如果查詢的總結果數非常大,使用者不太可能特别關心很遠的那些記錄。是以不需要提供給使用者直接跳轉到任意頁面的能力。比如可以像google那樣,隻提供前10頁的連結,10頁以外的頁面需要使用者挨個翻頁。

參考:

<a href="http://blog.163.com/digoal@126/blog/static/163877040201411152640383/">http://blog.163.com/digoal@126/blog/static/163877040201411152640383/</a>

<a href="http://www.orczhou.com/index.php/2009/03/four-way-pager-display/">http://www.orczhou.com/index.php/2009/03/four-way-pager-display/</a>

<a href="http://www.111cn.net/database/mysql/51004.htm">http://www.111cn.net/database/mysql/51004.htm</a>