elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch,发现有几种查询方式不太一样,思考了一下,总结如下

普通分页

等同于关系数据库的分页查询,例如 mysql 的 limit,如下 sql

select * from test limit 100000,10

这种查询方式有一个问题,需要查询 1000010 条数据到内存中,然后筛选出最后的 10 条数据进行返回,这样就会造成一个问题,对内存大大浪费。

对于 elasticsearch 也是这样,所以针对分页数量大于 10000 的数据做了限制,需要手动开启参数 track_total_hits 为 true 才行,如果这样做了会产生一个问题,就是大量数据加载 jvm 中(elasticsearch使用java开发,使用的lucene也是),内存吃紧开销大,造成频繁的 gc。

解除查询限制

PUT _all/_settings
{"index" : {"max_result_window" : 1000000}
}

这种方式是治标不治本,不建议修改

需要确保如下要求

from + size < max_result_window

为了解决这个深分页的问题,滚动查询出现了

scroll查询

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-scroll.html

从 5.0 版本开始添加。

scroll API 可用于从单个搜索请求检索大量结果(甚至所有结果),这与在传统数据库上使用游标的方式大致相同。
scroll 并不是为了实时用户请求,而是为了处理大量数据,只能往下查询。

通过第一次查询后返回一个scroll id,往后每次查询都基于这个scroll id,直到查询不到数据为止。

开始查询时形成一个快照,连续查询过程中,不会将新增加或修改的数据添加到查询结果中,也不支持跳页查询。

初始化时将所有符合搜索条件的搜索结果缓存起来,可以想象成快照,在遍历时,从这个快照里取数据,也就是说,在初始化后对索引插入、删除、更新数据都不会影响遍历结果。

如果想要在查询过程中某些数据修改了,需要查询到最新的数据。需要使用 search_after 来实现。

类似于事务隔离级别中的 REPEATABLE READ,每个事务只会在第一次执行查询语句时生成一个 ReadView,即数据修改了不影响本次查询的结果。

search_after

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-request-search-after.html

和 scroll 查询一样,从 5.0 版本开始添加。使用的场景不同。

search_after不是自由跳转到随机页面的解决方案,而是并行滚动许多查询的解决方案。

它与 API 非常相似,与 scroll 不同的是,search_after参数是无状态的,它总是根据搜索器的最新版本进行解析。因此,排序顺序可能会在步行过程中发生变化,具体取决于索引的更新和删除。

在查询过程中至少指定一个唯一不重复字段来排序。

类似于事务隔离级别中的 READ COMMITTED,每个事务在每次查询开始时都会生成一个独立的 ReadView,即数据修改了每次执行查询了数据都是不同的。

官方改进

轻量级试图(pit)

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/point-in-time-api.html

从 7.10 版本中开始添加。

https://www.elastic.co/guide/en/elasticsearch/reference/7.10/scroll-api.html

在这个文档上,指出了不推荐使用 scroll 查询,使用 search_after 和 pit 来代替。即针对快照数据建议使用这种方式。

对于search_after 和 pit 结合使用与 scroll 的到底有什么区别,官方文档也没做说明,也没找到对应的性能对比测试。

总结

查询方式数据量实时查询排序跳页使用场景与关系数据库事务隔离级别对应关系
from+size浅分页<=1000支持支持支持实时跳页查询,搜索引擎READ COMMITTED
scroll>10000不支持支持不支持深分页,无序批量查询.。
后台批处理、导出
REPEATABLE READ
search_after>10000支持支持不支持深分页,实时大批量查询READ COMMITTED

参考链接

https://blog.csdn.net/liaomingwu/article/details/117323936

https://blog.csdn.net/weixin_46097842/article/details/107889284

https://cloud.tencent.com/developer/article/1825190

https://juejin.cn/post/7088110134076899365

https://blog.csdn.net/UbuntuTouch/article/details/119926953

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597665.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S学习指南(62)-K8S源代码走读之Kube-Scheduler

文章目录 前言Kube-Scheduler 的代码结构Kube-Scheduler 的核心逻辑1. 调度框架1.1 阶段划分1.2 阶段执行 2. 调度算法2.1 优先级函数2.2 优选函数 3. 调度器插件3.1 预选插件3.2 优选插件3.3 绑定插件 4. 节点选择4.1 候选节点选择4.2 节点权重计算 5. 调度事件处理5.1 调度事…

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…

Jvm垃圾收集器系列之G1的小知识(个人见解仅供参考)

问&#xff1a;G1收集器有哪些主要特点&#xff1f; 答&#xff1a;G1收集器的主要特点包括&#xff1a;面向服务器、高吞吐量、满足GC停顿时间要求、将Java堆划分为多个大小相等的独立区域&#xff08;Region&#xff09;、保留了年轻代和老年代的概念但不再是物理隔阂、对大对…

在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c库&#xff0c;为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装&#xff0c;不料博主才边缘好自己的paddle2.6&#xff0c;paddle官方已经发布了cuda12.0的paddle2.6框架。…

C++ 学习系列 -- using关键字

一 概述 c 11 中新引入了关键字 using 二 using 关键字的用处 1. using namespace 与 using namespace member #include<vector> #include<list>int main() {using namespace std;vector<int> vec {1, 2, 3};using std::list;list<int> li {1,…

C++使用openssl的EVP对文件进行AES-256-CBC加解密

1、背景 有项目需求&#xff0c;有对文件进行加密的功能&#xff0c;经过评估&#xff0c;最终决定使用AES-256-CBC加密。在C中要实现这种加密有很多中方式和第三方库&#xff0c;由于运行环境的限制&#xff0c;可选择的库不多&#xff0c;最终决定使用openssl来进行。 关于AE…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Buffer的创建和销毁、扩容、写入数据

TcpConnection:封装的就是建立连接之后得到的用于通信的文件描述符&#xff0c;然后基于这个文件描述符&#xff0c;在发送数据的时候&#xff0c;需要把数据先写入到一块内存里边&#xff0c;然后再把这块内存里边的数据发送给客户端&#xff0c;除了发送数据&#xff0c;剩下…

Jvm垃圾收集器系列之CMS收集器(个人见解仅供参考)

问&#xff1a;什么是CMS收集器&#xff1f; 答&#xff1a;CMS&#xff08;Concurrent Mark Sweep&#xff09;收集器是Java HotSpot虚拟机中的一种垃圾收集器&#xff0c;主要用于实现低延迟的垃圾回收。 问&#xff1a;CMS收集器的主要目标是什么&#xff1f; 答&#xff1a…

基于综合特征的细菌噬菌体宿主预测工具iPHoP (Integrated Phage HOst Prediction)的介绍以及使用方法详细流程

介绍 iPHoP&#xff08;Integrated Phage HOst Prediction&#xff09;是一种基于综合特征的细菌噬菌体宿主预测方法。它是通过整合基因组序列、蛋白质序列和宿主基因组信息来预测细菌噬菌体的宿主范围。 iPHoP的预测过程分为三个步骤&#xff1a;特征提取、特征选择和宿主预…

Ubuntu22.04无法启动EasyConnect的问题

转自&#xff1a;https://juejin.cn/post/7121236352032571422 无法启动主要是因为依赖包版本高&#xff0c;不兼容&#xff0c;要降级 解决方法&#xff1a; 1、安装easyconnect&#xff08;已安装就跳过&#xff09; 2、EasyConnect的安装位置在 /usr/share/sangfor/EasyCon…

【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …

“华为杯”杭州电子科技大学2023新生编程大赛---树

题目链接 Problem Description 给定一棵包含 n 个节点的带边权的树&#xff0c;树是一个无环的无向联通图。定义 xordist(u,v) 为节点 u 到 v 的简单路径上所有边权值的异或和。 有 q 次询问&#xff0c;每次给出 l r x&#xff0c;求 ∑rilxordist(i,x) 的值。 Input 测试…

一篇文章学会如何在 NestJS 中使用 Redis 并基于 Redis 实现接口访问限频率

前言 在处理高频数据操作和大规模并发请求的场合&#xff0c;我们需要一种机制能够快速读取和缓存数据&#xff0c;这时 Redis 就闪亮登场了。Redis 是一个开源的内存中数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 NestJS 是一个灵活且模块化的Node.j…

frp透传软件最新toml格式的配置文件的使用

frp软件在0.52.0版本开始支持 toml格式的配置文件了&#xff0c;并将在后继某个版本开始取消对 ini配置格式的支持。这里做一下新旧配置文件的比较。 一、frps 服务端配置文件的变化 frps.ini cat /etc/frp/frps.ini[common] bind_port7000 vhost_http_port8080 vhost_https…

JVM之内存模型带参数

Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里)&#xff1a; java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize256M ‐XX:MaxMetaspaceSize256M ‐jar xxxxxx.jar-Xss&#xff1a;每个线程的栈大小 -Xms&#xff1a;设置…

关于“Python”的核心知识点整理大全61

目录 注意 20.1.4 使用 jumbotron 设置主页的样式 index.html 20.1.5 设置登录页面的样式 login.html 20.1.6 设置 new_topic 页面的样式 new_topic.html 20.1.7 设置 topics 页面的样式 topics.html 元素&#xff0c;让它们在页面上显得大些&#xff08;见2&#xf…

imgaug库指南(三):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

prometheus与zabbix监控的对比介绍

一、普米与zabbix基本介绍 1、prometheus介绍 Prometheus的基本原理是Prometheus Server通过HTTP周期性抓取被监控组件的监控数据&#xff0c;任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式&#xff0c;就可以接入Prometheus监控。 工作流程大致分为收集数…

嵌入式Linux之MX6ULL裸机开发学习笔记(汇编LED灯点亮)

汇编LED驱动实验 1.驱动编写 首先创建在vscode上创建工作区&#xff0c;创建led.s汇编文件&#xff0c;然后编写以下程序 .global _start 全局标号 _start: /* 使能所有外设时钟 */ ldr r0,0x020c4068 CCGR0 ldr r1,0xffffffff 要向CCGR0写入的数据 str r1,[r0] 将0xff…