es、MySQL 深度分页问题

文章目录

    • [es 深度分页](#es 深度分页)
    • [MySQL 深度分页](#MySQL 深度分页)

es 深度分页

es 深度分页问题,有点忘记了,这里记录一下
当索引库中有10w条数据,比如是商品数据;用户就是要查在1w到后10条数据,怎么查询。

  • es查询是从各个分片中取出前1w到后10条数据,然后进行数据汇总,在对汇总的数据进行排序后,取出1w到后10条数据

  • 这个汇总后的数据排序是在 heap内存中进行的,如果数据量过大的话,可能会导致OOM

  • 频繁的深度分页查询,会导致频繁的FGC,导致服务卡顿

    但是嘿,我就是查怎么办?

  • 默认es指定分页深度 max_result_window 是10000条,超过这个数据量默认是不允许查询的。
    方法一: 修改该索引的,分页深度;比如修改为 10w条

  • 有风险,容易溢出、或效率低下

shell 复制代码
## 修改分页深度
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
java 复制代码
GET goods/_search?scroll=1m
{
  "size" : 10000
}

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "${上次查询的滚动id}" 
}

方法3:search_after 排序唯一,根据上次返回排序数组值,当做 search_after请求参数

  • 使用search_after参数将第一次查询结果中最后一个文档的排序值作为起
  • es根据这个排序值,找到下一页的文档,并将最后一个文档的排序值记录下来
  • 不支持向前搜索,只能向后执行
  • 每次只能向后搜索1页数据
java 复制代码
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条数据

sql 复制代码
-- 取1000w行数据
select * from person order by p.create_time desc limit 10000000,100

select * 查询时,如果以 创建时间建一个索引,idx_create_time ,因为没有覆盖索引,所以需要回表,要回表1000w次

  • 所以查询很慢,我们需要避免回表。
  • 借鉴一下图 ↓
    先用 覆盖索引的子查询,缩短查询时间范围
sql 复制代码
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ㄒ)/~~

相关推荐
core51212 小时前
Elasticsearch 车牌号片段搜索:n-gram 倒排索引实战方案
elasticsearch·n-gram·索引·倒排索引·号牌·片段
এ慕ོ冬℘゜12 小时前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
Sayai15 小时前
Elasticsearch 日志写入链路调优实战:ingest pipeline 补时间戳、时区偏移修复与按值类型路由(附 translog 实测)
大数据·运维·elasticsearch·搜索引擎·性能优化
总爱写点小BUG16 小时前
git-tidy:一个把「提交规范治理」做成闭环的 Git 桌面客户端
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
BreezeJiang2 天前
写了 Dockerfile 却没生效:ES + Kibana 的 compose 配置里,藏着三个反直觉的点
elasticsearch
Elasticsearch3 天前
Elastic 计划利用 NVIDIA RTX GPU 将 Jina 模型推理速度提升至 8 倍
elasticsearch
Elastic 中国社区官方博客3 天前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客3 天前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es
深海里的鱼(・ω<)★3 天前
SMB备份导致的 Gitea 分支推送成功但界面不可见故障复盘
大数据·elasticsearch·gitea