购物建设网站,nas 支持做网站,江镇做包子网站,和田网站制作文章目录 es 深度分页MySQL 深度分页 es 深度分页 es 深度分页问题#xff0c;有点忘记了#xff0c;这里记录一下 当索引库中有10w条数据#xff0c;比如是商品数据#xff1b;用户就是要查在1w到后10条数据#xff0c;怎么查询。 es查询是从各个分片中取出前1w到后10条数… 文章目录 es 深度分页MySQL 深度分页 es 深度分页 es 深度分页问题有点忘记了这里记录一下 当索引库中有10w条数据比如是商品数据用户就是要查在1w到后10条数据怎么查询。 es查询是从各个分片中取出前1w到后10条数据然后进行数据汇总在对汇总的数据进行排序后取出1w到后10条数据这个汇总后的数据排序是在 heap内存中进行的如果数据量过大的话可能会导致OOM频繁的深度分页查询会导致频繁的FGC,导致服务卡顿 但是嘿我就是查怎么办 默认es指定分页深度 max_result_window 是10000条超过这个数据量默认是不允许查询的。 方法一 修改该索引的分页深度比如修改为 10w条 有风险容易溢出、或效率低下 ## 修改分页深度
PUT goods/_settings
{max_result_window:100000
}
# 查数据
GET goods/_search
{from : 10000 , size : 10
} 方法二滚动查询一部分数据一部分的查无需修改分页深度 scroll 查询是可以避免在处理大量数据时将所有结果一次性加载到内存中所带来的内存压力。通过使用scroll只有当前批次的结果需要被加载到内存中而不是整个结果.第一次scroll 会将结果保存快照,存活时间 1m分钟在第二次滚动会根据当前scroll_id定位到快照查询下一批次的结果然后的在程序里取出 1w~10009但是 scroll查询会占用Elasticsearch的资源因为它需要维护结果集的快照Scrolls默认 滚动次数限制在 500 GET goods/_search?scroll1m
{size : 10000
}POST /_search/scroll
{scroll : 1m, scroll_id : ${上次查询的滚动id}
}方法3search_after 排序唯一根据上次返回排序数组值当做 search_after请求参数 使用search_after参数将第一次查询结果中最后一个文档的排序值作为起es根据这个排序值找到下一页的文档并将最后一个文档的排序值记录下来不支持向前搜索只能向后执行每次只能向后搜索1页数据 GET goods/_search
{sort: [{price: {order: asc}}],from : 9990 , size : 10
}GET goos_index/_search
{sort: [{price: {order: asc}}],search_after: [9999.0]
}MySQL 深度分页 2000w条记录的表需要查询第100w、1000w以及后10条数据 -- 取1000w行数据
select * from person order by p.create_time desc limit 10000000,100select * 查询时如果以 创建时间建一个索引idx_create_time 因为没有覆盖索引所以需要回表要回表1000w次 所以查询很慢我们需要避免回表。借鉴一下图 ↓ 先用 覆盖索引的子查询缩短查询时间范围 select p.* from person p
where p.create_time (select create_time from person t order by t.create_time desc limit 10000000,1)
order by p.create_time desc limit 10 悲催的面试 /(ㄒoㄒ)/~~