Elasticsearch 使用误区之五——单次请求获取大量数据

news2024/9/24 2:20:01

在使用 Elasticsearch 进行数据查询时,很多开发者、读者会遇到这样的问题:一次性检索大量数据,导致查询速度缓慢、网络延迟增加,甚至影响系统的整体性能。

单次获取过多数据不仅增加了网络传输的负担,还会使查询过程复杂化,降低响应速度。

本文将深入探讨该误区的常见场景、错误原因以及优化方案,帮助大家有效避免这个常见的性能陷阱。

1. 误区背景:单次获取大量数据

许多开发者在使用 Elasticsearch 进行数据查询时,往往试图一次性获取大量文档,认为可以减少查询次数并加速开发流程。

8ef1ab949f4f5d5ace6fa6729570cb86.png

——来源:https://t.zsxq.com/cYUnx

b9db25c336f7c54cad5a32a06c6c96f9.png

问题来源:https://articles.zsxq.com/id_qvaduu4ejgns.html

然而,Elasticsearch 是为分布式环境设计的,单次大规模的数据检索会对系统的性能造成负面影响,

具体表现为:

  1. 网络延迟增加。 大量数据的传输会占用带宽资源,导致网络延迟加大。

  2. 查询性能下降。系统需要消耗更多的内存和 CPU 来处理大规模结果集,进而拖慢查询速度。

  3. 系统负载增加。在负载高峰期,多个大查询可能导致节点资源过载。

2. 真实场景:电商平台用户查询

2.1 场景描述:

某电商平台的用户数据存储在一个包含数百万条用户记录的 Elasticsearch 索引中。

业务部门需要查询用户数据进行分析,但开发团队直接通过 match_all 查询所有用户,并设置 size 参数为 10000,试图一次性获取大量数据。

GET /users/_search
{
"query": {
"match_all": {}
},
"size": 10000
}

2.2 问题描述:

该查询一次性返回 10000 条完整的用户数据,导致以下问题:

  • 问题1:网络延迟

10,000 条数据中包含许多不必要的字段,增大了网络传输的数据量,导致响应时间延长。

大家知道, Elasticsearch 非 MySQL 等关系型数据库,字段不需要提前设定,如果 Mapping 不设置 strict 而是 默认值,意味着字段可以无限扩充,直到接近默认值 1000。

具体限制的设置项是:

index.mapping.total_fields.limit

此参数决定一个索引中可以包含的字段的最大数量。默认值是 1000。

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-settings-limit.html

  • 问题2:查询性能问题

处理如此多的数据占用了系统资源,使得查询速度减慢,影响了其他业务请求。

  • 问题3:用户体验差

由于查询响应缓慢,业务人员在使用系统时感觉卡顿,影响日常工作效率。

3、错误原因分析

出现这种性能问题的主要原因是:

  • 可能原因1:一次性获取过多数据

在大量数据场景中,单次获取 10000 条数据会显著增加负载。

  • 可能原因2:未使用字段过滤

默认情况下,Elasticsearch 返回每个文档的所有字段,而业务部门往往只需要几个关键字段。

  • 可能原因3:未分页处理

没有采用分页机制来分批获取数据,而是直接获取整个结果集。

4、改进方案

要优化这种场景下的查询,以下几种策略可以显著提升性能:

4.1 限制返回的文档数量

通过分页机制限制每次查询返回的文档数量,避免一次性获取过多数据。

分页不仅能减小单次查询的负载,还能提升整体查询的稳定性。

GET /users/_search
{
  "query": {
    "match_all": {}
  },
  "size": 10,
  "from": 0
}

这个查询一次性只返回 10条文档,并且可以通过 from 参数进行分页查询,避免单次查询获取过多数据。

这里深度分页的弊端关注一下,如下两幅图(建议放大查看)所示:Elasticsearch 中的深分页问题是一个常见的性能陷阱,因为越深的分页需要对越多的数据进行处理,这可能导致大量的资源消耗。

假设不断在这个边缘试探,会导致内存耗尽甚至有宕机风险。

e7c83a7ecfebd8719bfbe774048f870e.png

2811f20e97e0148d821eff31d9f7acae.png

问题参见:https://t.zsxq.com/RNWdK

4.2 使用源过滤(_source filtering)

在业务场景中,并非所有字段都是必要的,因此通过源过滤功能只返回特定字段可以减少数据传输量,进而提升查询效率。

GET /users/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name", "email"],
  "size": 10,
  "from": 0
}

这个查询只返回用户的 name 和 email 字段,减少了不必要的字段传输,降低了网络延迟和系统资源的消耗。

4.3 利用部分更新

如果需要更新用户文档,你可以只提供更新的字段,Elasticsearch 会重新索引整个文档,但不需要在请求中提交完整文档。部分更新减少了请求体的大小,但重新索引整个文档的操作仍会发生。

POST /users/_update/1
{
  "doc": {
    "email": "new_email@example.com"
  }
}

4.4 使用 Scroll API 或 search_after 处理大量数据

对于确实需要处理大量数据的场景,Scroll API 是更好的解决方案。Scroll API 允许你分批检索大量文档而不会影响集群性能。

GET /users/_search?scroll=1m
{
  "query": {
    "match_all": {}
  },
  "size": 100
}

POST /_search/scroll
{
  "scroll": "1m",
  "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAPnMWSU5tbk5Za1NsVEd..."
}

初始查询的时候,设置 scroll 参数并指定时间窗口,初次检索 100 条数据。

滚动查询需要使用 scroll_id 获取接下来的批次,直到所有数据被检索完。

Scroll API 保持了上下文信息,允许高效地分批处理数据,适用于一次性处理大量数据的批处理任务。

更多推荐:干货 | 全方位深度解读 Elasticsearch 分页查询

5. 进一步优化建议

5.1 合理设置查询条件

避免使用过于宽泛的查询条件,如 match_all,可以通过精确条件限定查询结果集的大小。

5.2 使用聚合功能

如果你只关心统计数据而不是具体文档,利用 Elasticsearch 的聚合功能可以直接返回统计结果,避免大量数据传输。

5.3 索引优化

定期优化索引,确保分片和副本的设置合理,避免查询时的热点问题。

6. 小结

在使用 Elasticsearch 时,合理设计查询是提升系统性能的关键。

通过限制返回文档数量、使用源过滤和部分更新等技术,可以有效减少数据传输量,提高查询效率。

对于需要检索大量数据的情况,利用 Scroll API 和分页机制,可以进一步优化查询性能,避免一次性获取大量数据带来的性能问题。

Elasticsearch 的强大功能需要合理使用,开发者应根据实际业务需求设计高效的查询方案,以充分发挥其优势。

更多推荐

  1. Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

  2.   Elasticsearch 使用误区之二——频繁更新文档

  3. Elasticsearch 使用误区之三——分片设置不合理

  4. Elasticsearch 使用误区之四——不合理的使用 track_total_hits

  5.    《一本书讲透 Elasticsearch》读者群的创新之路

db40fc77ea03e69b126a6da60657edd5.png

更短时间更快习得更多干货!

和全球2000+ Elastic 爱好者一起精进!

elastic6.cn——ElasticStack进阶助手

a8d37dd9db2ebd6a2f8b6282cabdfea2.gif

抢先一步学习进阶干货!

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

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

相关文章

Vue 中的 Web Workers:提升性能与流畅度

大家可能都听到过 Web Workers,那究竟如何使用呢?可以往下了解一下。 1. 什么是 Web Workers? Web Workers 是现代浏览器提供的一种机制,允许我们在主线程之外运行 JavaScript 脚本,避免阻塞 UI 渲染和用户交互操作。…

verilog vscode 与AI 插件

Verilog 轻量化开发环境 背景 笔者常用的开发环境 VIAVDO, 体积巨大,自带编辑器除了linting 能用,编辑器几乎不能用,仿真界面很友好,但是速度比较慢。Sublime Text, 非常好用的编辑器,各种插件使用verilog 非常方便…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说,程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制,让java程序员不需要手写delete或者free代码,不容易出现内存泄漏和内存溢出问题,但是如果…

CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案

强强联合 人工智能与大数据的迅速发展,大模型的推理应用和资产管理已成为企业数字化转型的重要组成部分,企业正寻求高效、安全的AI模型部署解决方案。为应对日益增长的计算需求和复杂的数据管理挑战,CSGHub、Nvidia和阿里云计算巢强强联手&a…

Frozen CLIP: A Strong Backbone for Weakly Supervised Semantic Segmentation

摘要 弱监督语义分割在图像级标签方面取得了巨大的成就。最近的几种方法使用CLIP模型生成伪标签来训练单个分割模型,而没有尝试将CLIP模型作为主干,直接分割具有图像级标签的对象。在本文中,我们提出了 WeCLIP,一个基于 CLIP 的单…

【笔记】自动驾驶预测与决策规划_Part1_自动驾驶决策规划简介

自动驾驶决策规划简介 0、前言1、自动驾驶概述1.1 预测(Prediction)1.2 决策(Decision Making)1.3 规划(Planning) 2、自动驾驶历史和背景3、自动驾驶级别和分类4、预测决策规划的重要性4.1 预测的重要性4.…

环境搭建---部署rabbitmq集群

rabbitmq下载:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.34/rabbitmq-server-generic-unix-3.8.34.tar.xz erlang下载:https://github.com/erlang/otp/releases/download/OTP-24.3.4.1/otp_src_24.3.4.1.tar.gz 配置主机名 …

MySQL原理之UUID主键分析,插入或更新语法分析

文章目录 1 MySQL不能用UUID做主键1.1 前言1.2 mysql和程序实例1.2.1 准备工作1.2.2 开始测试1.2.3 程序写入结果1.2.4 效率测试结果 1.3 使用uuid和自增id的索引结构对比1.3.1 自增id1.3.2 uuid 1.4 自增id缺点1.5 雪花算法 2 插入或更新2.1 on duplicate key2.1.1 定义2.1.2 …

git版本问题Your branch is behind ‘origin/dev‘by 2 commits,

git版本问题 一个不小心点击了版本的修改,于是就进入了翻滚中,回不来了 遇事还是不要慌,出现这个问题,如果那些你不需要,只是需要回到某一个版本,那么就是需要 git reset --hard origin/master 上面这就…

Vue3入门 - 登录功能开发(Vue3+ts+Pinia+Element Plus)

Vue3中实现登录功能,通常涉及到创建一个表单,用户输入用户名和密码,然后将信息发送到后端进行验证,得到响应结果后作出相应操作。 一、创建项目 这里他用pnpm进行项目的创建的,所以需要事先全局安装pnpm(在…

神经网络的非线性激活

文章目录 一、神经网络的非线性激活是什么二、非线性激活常用函数三、非线性激活的实际演示 一、神经网络的非线性激活是什么 神经网络的非线性激活函数的主要作用是引入非线性变换,从而使网络能够学习和逼近复杂的函数关系。在神经网络中,线性变换&…

[产品管理-4]:NPDP新产品开发 - 2 - 战略 - 制定企业经营战略目标的结构化方法与工具

目录 一、SWOT分析工具 1、SWOT分析工具概述 2、SWOT分析与企业战略目标制定的关系 3、SWOT分析在企业战略目标制定中的应用实例 4、SWOT分析的改进与应用建议 二、P E S T L E 分 析:外部环境分析 2.1 概述 1. 政治因素(Political) …

COCOS:(飞机大战08)子弹和飞机添加碰撞器和刚体

做两个物体的碰撞有2种方式:碰撞检测和触发检测 这里子弹不能和飞机使用碰撞检测,因为会影响到敌机的运动,所有选择使用触发检测 从预制体Prefabs文件中,将子弹Bullet1和Bullet2拖到Canvas下 选中子弹,添加组件&#…

多线程:java中的实现

实现1: 通过java.util.concurrent.atomic中的原子性数据实现 static class Counter {// 通过加锁实现同步public static int count 0;public static final Object obj new Object(); // 通过原子性的整型来实现同步public static AtomicInteger c…

DesignPattern设计模式

1 前言 1.1 内容概要 理解使用设计模式的目的掌握软件设计的SOLID原则理解单例的思想,并且能够设计一个单例理解工厂设计模式的思想,能够设计简单工厂,理解工厂方法了解建造者模式的思想,掌握其代码风格理解代理设计模式的思想&a…

应用层自定义协议与序列化

一、理解应用层 上一篇文章http://t.csdnimg.cn/931k6简单介绍了如何写tcp / udp 网络服务,但是其实始终是在应用层。 一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应用层。 二、再谈协议 协议是一种 "约定"。socket api 的接口, 在读…

TiDB从0到1学习笔记(精华篇)

历时四个月,恭喜赵老师的《TiDB从0到1》 系列文章顺利完结,小编再次梳理一遍文稿,并附注解分享给大家。 整体架构 从 TiDB 1.0 到 8.0,TiDB 的体系结构一直在不断演进。接下来让我们一起看看整体架构的变化。 TiDB v1 TiDB v1&…

005——栈

目录 栈 栈的定义 栈的性质 栈的应用场景 存储结构: Ⅰ)采用顺序存储结构实现——顺序栈 Ⅱ)采用链式存储结构实现——链栈-->基于单链表(带头结点) 栈 栈的定义 之允许在一端进行插入和删除的线性表 栈的…

安卓获取apk的公钥,用于申请app备案等

要申请app的icp备案等场景,需要app的 证书MD5指纹和公钥,示例如下: 步骤1:使用keytool从APK中提取证书 1. 打开命令行,cd 到你的apk目录,如:app/release 2. 解压APK文件: unzip yo…

一维稳态与非稳态导热的详细分析

目录 引言 一维稳态导热 应用实例:单层平壁导热 数值求解: 一维非稳态导热 应用实例:单层平壁的非稳态导热 温度变化阶段 表格总结: 引言 热传导(Heat Conduction)是热量在物体内部通过微观粒子的相…