問題
在分頁處理時,我們要確定兩個參數,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 會為這個查詢做快照,然后給用戶提供一個游標來順序訪問快照。