一、ES调优手段
1.1 设计阶段调优
ES数据区分热、温、冷三个阶段
ES索引按月滚动生成
mapping设置合理的数据类型是否需要分词
使用别名管理索引???
1.2 数据写入优化
1> 单条写入改为多条数据写入
2> 自动生成ID
3> 索引刷盘时间,index.refresh_interval: 30s; 默认1s改为30s,减少刷盘频次
4> 大批量数据导入时,可以把副本分片设置为0
5> 设置segment段大小,参数如下:
indices.memory.index_buffer_size: 20% (最大堆内存百分比)
indices.memory.min_index_buffer_size: 96mb (最小缓存大小)
6> 设置节点之间的故障检测配置,例如以下elasticsearch.yml配置:
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s
1.3 查询优化
1.3.1 分片数合理评估
1> 集群总分片数建议控制在5w以内,单个索引的规模控制在 1TB 以内,单个分片大小控制在30 ~ 50GB ,docs数控制在10亿内,如果超过建议滚动;(预估就就是分片数最好小于20)
2> 分片的数量通常建议小于或等于ES 的数据节点数量,最大不超过总节点数的2倍,通过增加分片数可以提升并发;
3> 分片数越多长尾效应越明显,并不是越多越好,在搜索场景合理控制分片数也可以提升性能。
1.3.2 mapping设计
1> 合理设置 index:false(是否可索引),store:false(是否存储),doc_values:false (是否倒排)
2> 长字段增加序列化和高亮开销,但字段长度不能高于65536(short?),超长配置: ignore_above 忽略超长的数据。
3> 合理设置keyword类型,使用倒排索引。
4> 合理使用fields属性,对于text字段设置子字段为keyword,支持text和keyword两种功能。
"city": {"type":"text","fields":{"raw":{"type":"keyword"}}}
"sort": {"city.raw": "asc"}
5> 字段爆炸:
1) 父层级设置 enabled:false 防止子字段mapping,能被行存查出来
2) dynamic=runtime 入新字段也会更新 mapping,但是新加入的字段不会被索引,dynamic=strict 不允许新增一个不在 mapping中的字段,dynamic=false (新字段不会被索引,不能作为查询条件,但是能被行存查询出来)。
3、查询 Routing 路由优化?
4、查询裁剪
1>索引裁剪:如果已经滚动产生了很多索引,这个时候每次通过别名查询全量索引时,一样会有大量空转查询,可以通过索引名特征或时间范围,指定具体的索引名 进行查询
5、fetch性能优化
1、字段设置40个,stored,docvalues,source 三种数据性能相同
1) 当字段数很少时,低于 40 时,使用 doc_value Fields 拉取,性能最优。
分析:如果我们只需要返回其中包含的一小部分字段时,读取并解压这个巨大的_source字段可能会开销很高。
2) 当字段超较多时,达到 40 以上时,使用 _source 变为最优。
分析:当我们需要非常多或者几乎全部字段时,此时使用 doc_value Fields 可能会有非常多的随机IO。这个时候,读取 _source 一个字段就能够处理全部业务字段。
设置示例:"properties" : {"_source":{"enabled":false//是否启用source}"field":{"type":"keyword","store":true,//是否存储原始值在storefields中"doc_values"true//是否存储原始值在docvalues中}"excludes":["meta.description","meta.other.*"]}
2、内部结构
Stored fields 在磁盘上以行的方式放置: 每个文档对应一个行,这个行包含该文档所有的stored fields。
Doc values 以列的方式存储. 不同文档的相同字段被连续地存储在一起. 这种存储方式,可以直接访问一个特定的文档的特定字段。
Source 与Stored fields方式差不多额外增加了_source字段存储全量json。
7、Force merge优化
减少小的segment
8、ES缓存设计
9、聚合优化
Metric 聚合 - 计算字段值的求和平均值,Geo-hash,采样等
Bucket 聚合 - 将字段值、范围、或者其它条件分组到Bucket中
Pipeline 聚合 - 从已聚合数据中进行聚合查询
10、分页查询
1、from + size
2、滚动翻页(Search Scroll)
3、流式翻页(Search After)文章来源:https://www.toymoban.com/news/detail-481714.html
详见:ES深度分页查询详解_es分页查询_斗者_2013的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-481714.html
到了这里,关于ES 查询及写入优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!