面试题答案
一键面试索引设计
- 选择合适的索引结构:根据业务场景,如果查询主要基于时间序列数据,可使用时间序列索引模式,按时间范围创建多个索引,如按天、周、月等。这样可以在查询时快速定位到相关时间范围的索引,减少检索数据量。
- 避免过度索引:只对需要进行查询、聚合的字段创建索引。过多的索引会增加存储成本和索引维护开销,降低写入性能。
字段映射
- 数据类型选择:确保字段映射的数据类型准确。例如,对于数值类型,如果不需要高精度,可选择范围合适的整数类型(如
integer
替代double
),这样能减少存储空间,提高查询性能。对于日期类型,明确指定格式,以便ElasticSearch能高效处理时间相关的聚合。 - 设置
doc_values
:对于需要进行排序、聚合操作的字段,开启doc_values
。doc_values
是磁盘上的列式存储,能加快聚合和排序的速度。例如,对要用于分组聚合的字符串字段,设置doc_values: true
。
分片策略
- 预估数据量和查询负载:在创建索引时,根据预计的数据总量和查询频率来确定合适的分片数量。如果数据量会持续增长,应预留一定的扩展空间。一般原则是每个分片的大小控制在几十GB到几百GB之间,避免单个分片过大影响查询性能。
- 动态调整分片:可以使用ElasticSearch的
_split
和_shrink
API 动态调整分片数量。在数据增长初期,可适当少分一些片,随着数据量增加,通过_split
操作增加分片;如果发现分片过多导致性能问题,可使用_shrink
操作合并分片。 - 考虑副本数量:副本数量不仅影响数据的高可用性,也会对查询性能产生影响。过多副本会增加存储成本和写入开销,但能提高读性能。根据业务的读写需求平衡副本数量,一般可设置1 - 2个副本。