面试题答案
一键面试性能下降原理
- 数据传输量:
from
值较大时,Elasticsearch 需要从底层存储检索大量文档,然后跳过前面from
数量的文档,仅返回size
数量的文档。这意味着大量数据在网络中传输,但最终大部分被丢弃,造成网络资源浪费。 - 排序开销:如果存在排序操作,Elasticsearch 必须对所有匹配文档(直到
from + size
)进行排序,随着from
值增大,排序的数据量急剧增加,排序开销呈指数级增长,严重影响性能。
优化策略及优缺点分析
1. Scroll 滚动查询
- 实现方式:使用
scroll
参数开启滚动查询,Elasticsearch 会为本次查询创建一个快照,后续请求通过scroll_id
获取下一批结果,类似数据库游标。 - 优点:
- 适合一次性处理大量数据,如数据迁移。它避免了每次请求都要重新计算排序和跳过大量文档的开销,性能相对稳定。
- 可以在不占用过多内存的情况下处理大量数据,因为它是分批获取数据。
- 缺点:
- 快照在滚动期间保持,占用集群资源,若长时间未关闭滚动,可能影响集群性能。
- 滚动查询返回的结果是快照数据,不反映实时变化,适用于对实时性要求不高的场景。
2. Search After 搜索后置
- 实现方式:基于上一次查询结果的最后一条文档的指定排序字段值作为下一次查询的
search_after
参数值,从而实现分页。 - 优点:
- 实时性较好,每次查询都是基于最新数据。因为不是基于快照,所以能反映文档的实时变化。
- 性能优于传统深度分页,不需要跳过大量文档,每次查询只需从上次结束位置继续,减少了排序和数据传输开销。
- 缺点:
- 实现相对复杂,需要记录上一次查询结果的排序字段值,并作为下一次查询参数。
- 依赖排序字段值的唯一性,如果排序字段值有重复,可能导致数据遗漏或重复。
3. 增加索引字段优化排序
- 实现方式:在索引时,增加额外的字段来辅助排序,例如对于时间序列数据,可以在索引时增加时间戳字段,并基于该字段进行排序和分页。
- 优点:
- 减少排序开销,特定字段的排序可能更高效,尤其是该字段已在索引层面做了优化(如按时间顺序存储)。
- 提升查询性能,对于频繁使用该字段进行分页的场景,优化效果明显。
- 缺点:
- 增加索引存储开销,额外的字段会占用更多存储空间。
- 索引维护成本增加,数据更新时需要同时更新这些辅助字段,增加了写入操作的复杂性。