zoukankan      html  css  js  c++  java
  • 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 会为这个查询做快照,然后给用户提供一个游标来顺序访问快照。 
  • 相关阅读:
    视音频开发测试文件下载
    H.264 中的Annex B格式和AVCC格式
    FFmpeg——命令笔记
    Gamma 矫正
    头文件 <string.h> <cstring> <string> 区别
    Serializable
    Oracle学习
    JDBC
    Servlet为主理解cookie,session,filter
    javaweb复习-环境篇
  • 原文地址:https://www.cnblogs.com/forestwang/p/6874727.html
Copyright © 2011-2022 走看看