es 如何解決深度分頁問題?


問題

在分頁處理時,我們要確定兩個參數,start & size,如果一個分頁查詢start值很大,那么這就是一個深度分頁查詢。
深度分頁是很有問題的,用sql舉例:select * from user order by id limit 10000,10 ,表面上看起來只取10條數據,而實際上它是個大查詢,因為查詢過程中,數據庫要確定前10010條數據,然后才能拿出最后10條。
顯而易見,一方面人為深度分頁是個偽需求,沒有誰會一直狂翻,或者直接跳第100頁看數據。另一方面,深度分頁對系統的穩定性有潛在威脅。

解決辦法

mysql並沒有限制深度分頁,而Es專門搞了一個  max_result_window 的東西 – 最大結果窗口,默認值是10000,它不僅限制了用戶在一次查詢中最多數據條數是1w條,並且限制了start+size 必須小於1w,也就是說,你想取第9999條,往后的2條數據是不可以的,因為 9999+2 > 10000。如此一來,一石二鳥,同時防止了一次取太多和深度分頁兩個問題。
好,那么問題就來了,那怎么取第1萬條以后的數據?要導數據怎么辦?為此,es 提供了一種數據遍歷的接口 — scroll,如果對數據不要求排序,可以用scroll+scan,速度更快。當使用scroll提取數據時,es 會為這個查詢做快照,然后給用戶提供一個游標來順序訪問快照。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM