1. 程式人生 > >分散式Solr的排序及分頁效能問題

分散式Solr的排序及分頁效能問題

分散式Solr的排序和分頁使用下面的演算法:
1. 傳入查詢條件q,排序sort,開始行數start,返回記錄數rows
2. 修改引數,向各個分片shard傳送新的查詢請求:
   a)保持q和sort不變
   b)修改start=0,rows=原start+原rows
   c)分片shard將會返回最多(原start+原rows)行資料,並且是按照sort排序的
3. 合併每個shard返回的資料,並按sort排序
4. 擷取[原start,原start+原rows-1]行資料,返回給前端


上面的演算法中,shard每次都返回[0,原start+原rows-1]行資料,導致shard的IO開銷特別大。
我們比較前端需要第n頁和第n+1頁的變化,可以知道:
第n+1頁的資料中包含了第n頁的資料,所以在剔除後,新的第n+1頁資料的傳輸量就會顯著下降。


演算法改進:
0. 假設分頁始終是遞增的,即取第n頁之後,才取第n+1頁
1. 傳入查詢條件q,排序sort,開始行數start,返回記錄數rows
2. 修改引數,向各個分片shard傳送新的查詢請求:
   a)保持q和sort不變
   b)獲取該shard保留的上次最大序號ID,如果沒有,則設為-1
   c)修改start=ID+1,rows=原start+原rows-ID-1
   d)分片shard將會返回最多(原start+原rows-ID-1)行資料,並且是按照sort排序的
   e)分片shard在結果集中返回shard名稱
3. 合併每個shard返回的資料,並按sort排序
   a)先按sort排序,再按shard排序
   b)資料格式:shard,sort,id,序號,...
4. 擷取[原start,原start+原rows-1]行資料,返回給前端
   a)按照shard,分組統計擷取的資料
   b)更新每個shard保留的最大序號ID