Elasticsearch聚合优化 | 聚合速度提升5倍

https://blog.csdn.net/laoyang360/article/details/79253294

1、聚合为什么慢?
大多数时候对单个字段的聚合查询还是非常快的, 但是当需要同时聚合多个字段时,就可能会产生大量的分组,最终结果就是占用 es 大量内存,从而导致 OOM 的情况发生。
实践应用发现,以下情况都会比较慢:
1)待聚合文档数比较多(千万、亿、十亿甚至更多);
2)聚合条件比较复杂(多重条件聚合);
3)全量聚合(翻页的场景用)。

2、聚合优化方案探讨
优化方案一:默认深度优先聚合改为广度优先聚合。
"collect_mode" : "breadth_first"
1
depth_first 直接进行子聚合的计算
breadth_first 先计算出当前聚合的结果,针对这个结果在对子聚合进行计算。
优化方案二: 每一层terms aggregation内部加一个 “execution_hint”: “map”。
"execution_hint": "map"
1
国内解释最详细的版本来自Wood大叔:

Map方式的结论可简要概括如下:
1)查询结果直接放入内存中构建map,在查询结果集小的场景下,速度极快;
2)但如果待结果集合很大的情况,map方式不一定也快。

3、做个实验
聚合的平衡点是多少呢?

3.1 实验场景
场景一:在近亿的document中,检索满足给定条件的数据,并对聚合结果全量聚合。
场景二:在百万级别的document中,全量聚合。
场景三:在近亿级别的document中,全量聚合。

3.2 聚合操作
POST index_*/_search
{
"sort": [
{
"nrply": "desc"
}
],
"aggs": {
"count_ix": {
"terms": {
"field": "ix_id",
"execution_hint": "map",

"size": 1000,
"collect_mode": "breadth_first"
}
}

},
"size":0
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1)修改索引名称,以获取更多的文档。
2)map模式添加 “execution_hint”: “map”,默认是global_ordinals模式。
3)”size”: 1000,设定聚合取值。

3.3 聚合结果

3.4 结果分析
对比场景一与场景二、三,说明:
1)当结果集合比较少的时候,map聚合方式明显速度更快,速度提升了接近5倍!
2)当结果集合比较大的时候(百万——亿级别)的时候,传统的聚合方式会比map方式快。

4、小结
1)global_ordinals是关键字字段( keyword field )的默认选项,它使用 全局顺序(global ordinals) 来动态分配存储区,因此内存使用情况与作为聚合作用域一部分的文档值的数量成线性关系。

2)只有极少数文档与查询匹配匹配时才应考虑使用map方式。
默认情况下,只有在脚本上运行聚合时才会使用map,因为它们没有序号( ordinals )。

否则,基于 顺序(ordinals) 的执行模式会相对更快。

参考:
http://t.cn/R8WI6QD
http://t.cn/R8WIKta
https://elasticsearch.cn/question/1008
http://t.cn/R8WIpYn
---------------------
作者:铭毅天下
来源:CSDN
原文:https://blog.csdn.net/laoyang360/article/details/79253294
版权声明:本文为博主原创文章,转载请附上博文链接!

原文地址:https://www.cnblogs.com/wangmo/p/9917564.html

时间: 2024-08-01 11:06:30

Elasticsearch聚合优化 | 聚合速度提升5倍的相关文章

使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

在这篇文章中我们将讨论如何利用 Apache Spark 来提升 MySQL 的查询性能. 介绍 在我的前一篇文章Apache Spark with MySQL 中介绍了如何利用 Apache Spark 实现数据分析以及如何对大量存放于文本文件的数据进行转换和分析.瓦迪姆还做了一个基准测试用来比较 MySQL 和 Spark with Parquet 柱状格式 (使用空中交通性能数据) 二者的性能. 这个测试非常棒,但如果我们不希望将数据从 MySQL 移到其他的存储系统中,而是继续在已有的

如何将 iOS 工程打包速度提升十倍以上

如何将 iOS 工程打包速度提升十倍以上 过慢的编译速度有非常明显的副作用.一方面,程序员在等待打包的过程中可能会分心,比如刷刷朋友圈,看条新闻等等.这种认知上下文的切换会带来很多隐形的时间浪费.另一方面,大部分 app 都有自己的持续集成工具,如果打包速度太慢, 会影响整个团队的开发进度. 因此,本文会分别讨论日常开发和持续集成这两种场景,分析打包速度慢的瓶颈所在,以及对应的解决方案.利用这些方案,笔者成功的把公司 app 的持续集成时间从 45 min 成功的减少到 9 min,效率提升高达

【Android】判断快捷方式是否存在的原理——优化网上通用的(速度提升10倍)

1原理: 这个是在2.3的时候无意发现的,当我照着网上的例子查询快捷方式是否创建的时候突然应用程序挂了,说是缺少权限. com.android.launcher.permission.READ_SETTINGS或者com.android.launcher.permission.WRITE_SETTINGS 然后我就添加了权限,虽然是可以判断了,但是小米,HTC等手机都不能正常使用,这时候突然发现了网上了一段代码,才明白了网友们的想法,现在就来简单分析下,并做出优化. String url = "

MySQL 千万 级数据量根据(索引)优化 查询 速度

一.索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让人难以忍受了. 提升查询速度的方向一是提升硬件(内存.cpu.硬盘),二是在软件上优化(加索引.优化sql:优化sql不在本文阐述范围之内). 能在软件上解决的,就不在硬件上解决,毕竟硬件提升代码昂贵,性价比太低.代价小且行之有效的解决方法就是合理的加索引. 索引使用得当,能使查询速度提升上万倍,效

干货 | Elasticsearch Reindex性能提升10倍+实战(转)

转自https://blog.csdn.net/laoyang360/article/details/81589459 1.reindex的速率极慢,是否有办法改善?以下问题来自社区:https://elasticsearch.cn/question/3782 问题1:reindex和snapshot的速率极慢,是否有办法改善?reindex和snapshot的速率比用filebeat或者kafka到es的写入速率慢好几个数量级(集群写入性能不存在瓶颈),reindex/snapshot的时候C

优化临时表使用,SQL语句性能提升100倍

[问题现象] 线上mysql数据库爆出一个慢查询,DBA观察发现,查询时服务器IO飙升,IO占用率达到100%, 执行时间长达7s左右.SQL语句如下:SELECT DISTINCT g.*, cp.name AS cp_name, c.name AS category_name, t.name AS type_name FROMgm_game g LEFT JOIN gm_cp cp ON cp.id = g.cp_id AND cp.deleted = 0 LEFT JOIN gm_cate

ES优化聚合查询之深度优先和广度优先

1.优化聚合查询示例 假设我们现在有一些关于电影的数据集,每条数据里面会有一个数组类型的字段存储表演该电影的所有演员的名字. { "actors" : [ "Fred Jones", "Mary Jane", "Elizabeth Worthing" ] } 如果我们想要查询出演影片最多的十个演员以及与他们合作最多的演员,使用聚合是非常简单的: { "aggs" : { "actors"

nginx缓存静态资源,只需几个配置提升10倍页面加载速度

nginx缓存静态资源,只需几个配置提升10倍页面加载速度 首先我们看图说话 这是在没有缓存的情况下,这个页面发送了很多静态资源的请求: 1.png 可以看到,静态资源占用了整个页面加载用时的90%以上,而且这个静态资源还是已经在我使用了nginx配置压缩以后的大小,如果没有对这些静态资源压缩的话,那么静态资源加载应该会占用这个页面展示99%以上的时间.听起来是不是已经被吓到了,但是数据已经摆在这里了,这可不是危言耸听. 然后再看看使用了nginx缓存之后的效果图: 2.png 看到没有,朋友们

一句话爆破速度提升一千倍python脚本

这个脚本是接地提供的思路,一句话爆破速度提升一千倍,看了他的帖子然而没有看到工具,思路很牛逼,我提供一个Python脚本 本地测试了下,十万密码只需要3秒,速度还是可以的 # coding:utf-8 # __author__ : learn import threading,Queue,requests class Add_password: def __init__(self,dictname,queue): self.dictname = dictname self.queue = que