面试题答案
一键面试索引结构方面
- 可能原因:
- 字段过多:索引包含大量不必要的字段,这会增加索引大小,导致查询时扫描的数据量增大。
- 字段类型不当:例如使用了不恰当的文本类型(如keyword用于长文本),影响查询性能。
- 嵌套文档过深:复杂的嵌套结构会使查询处理变得复杂。
- 优化策略:
- 精简字段:只保留必要的字段,对不需要查询的字段设置
doc_values: false
或index: false
。 - 正确设置字段类型:根据实际需求选择合适的字段类型,如使用
text
类型存储长文本并进行分词,使用keyword
类型存储精确匹配的短文本。 - 优化嵌套结构:尽量扁平化数据结构,减少嵌套层级,对于确实需要嵌套的情况,控制嵌套深度。
- 精简字段:只保留必要的字段,对不需要查询的字段设置
查询优化方面
- 可能原因:
- 复杂查询语句:使用了过于复杂的布尔查询、嵌套查询等,导致查询解析和执行时间长。
- 缺少合适的索引:查询条件未命中已有索引,导致全量扫描。
- 排序字段未优化:对未建立排序索引的字段进行排序,增加查询负载。
- 优化策略:
- 简化查询:拆分复杂查询为多个简单查询,逐步筛选数据。
- 创建合适索引:分析查询条件,为高频查询字段创建索引,使用
explain
API分析查询执行计划,检查索引使用情况。 - 优化排序:对需要排序的字段建立排序索引,避免在大字段上排序,尽量使用单字段排序,减少多字段排序。
集群配置方面
- 可能原因:
- 节点资源不足:CPU、内存、磁盘等资源紧张,影响查询处理能力。
- 副本数过多:过多的副本会占用大量资源,同时在主副本同步时影响性能。
- 分片分配不合理:某些节点承载过多分片,造成负载不均衡。
- 优化策略:
- 增加资源:根据监控数据,合理增加节点的CPU、内存等资源,或者增加节点数量。
- 调整副本数:根据数据的重要性和查询负载,适当减少副本数,如设置为1个副本,在高可用和性能间取得平衡。
- 重新分配分片:使用
_cluster/reroute
API手动调整分片分配,或调整集群的自动分片分配策略,使分片在节点间均匀分布。