从写入和查询两个维度介绍CSS向量数据库的性能优化方案。
写入性能优化
向量数据写入时涉及副本同步、索引刷新(refresh)和段合并(merge)三大开销。索引实时写入时,频繁的索引刷新会生成大量小segment,触发额外的向量索引构建和合并操作,消耗大量CPU/IO资源。因此,写入性能优化,主要从这几方面入手。
- 方案介绍
在数据导入期间临时关闭副本,待数据导入完成后再重新开启。适用于批量导入历史数据或全量更新场景(如初始化向量数据库)。
- 操作
修改副本数:
PUT my_index/_settings
{
"number_of_replicas": 0
}
- 效果
避免副本节点的实时向量索引构建开销,提升写入性能。
- 方案介绍
将索引的刷新间隔设置为120s或更大,以减少频繁刷新索引生成的小segment数量,同时降低segment合并带来的向量索引构建开销。也可以直接关闭自动刷新索引,即将索引的刷新间隔设置为“-1”。适用于高吞吐写入场景(如日志型向量数据流)。
- 操作
设置“refresh_interval”:
PUT my_index/_settings
{
"refresh_interval": "120s"
}
- 效果
减少refresh次数,避免生成大量小segment,降低segment合并开销,提升写入性能。
- 方案介绍
适当增加向量索引构建的线程数可以加速索引构建过程,但是不建议设置过大,避免产生过多的构建线程抢占查询资源。适用于CPU资源充足但写入延迟高的场景(如GPU服务器环境)。
- 操作
向量索引构建的线程数“native.vector.index_threads”默认值为 4,可以根据实际需求进行调整:
PUT _cluster/settings
{
"persistent": {
"native.vector.index_threads": 8
}
}
- 效果
并行加速向量索引构建,提升写入并发能力。
查询性能优化
查询性能受segment数量、内存熔断机制及字段召回方式影响。大量segment会降低搜索效率;堆外内存不足时向量索引频繁换入换出;召回全字段会加重fetch阶段负载。因此,查询性能优化,主要从这几方面入手。
- 方案介绍
在批量导入数据完成后,执行forcemerge操作强制段合并可以减少segment数量。该操作一般在写入后、查询前执行(如定时批量导入后的检索准备)。
- 操作
执行forcemerge操作:
POST my_index/_forcemerge?max_num_segments=1
- 效果
将多个segment合并为1,减少搜索时文件扫描开销,提升查询速度。
- 方案介绍
在批量写入时,系统自动合并生成的segment上限值是5GB,通过提升segment大小上限可以减少自动合并后的segment数量,该操作一般在写入数据前执行。
- 操作
调整segment大小上限:
PUT my_index/_settings
{
"index.merge.policy.max_merged_segment": "10gb"
}
- 效果
有效减少segment数量,减少查询计算开销,提升查询速度。
- 方案介绍
如果向量索引所需的堆外内存超过熔断线,查询时索引的缓存管理器会频繁进行索引的换进换出操作,导致查询变慢。通过适当调大熔断线的配置,可以避免因内存不足导致的查询频繁触发熔断(如日志提示“CircuitBreakingException”)。
- 操作
堆外内存熔断线的默认值是80%,可以根据实际需求进行调整:
PUT _cluster/settings
{
"persistent": {
"native.cache.circuit_breaker.cpu.limit": "85%"
}
}
- 效果
避免向量索引被换出,减少查询抖动。
- 方案介绍
如果查询结果需要返回的字段较少且均为keyword或数值类型字段,可以通过docvalue_fields配置来召回必要字段。这种方式适用于仅需返回数值/枚举类元数据(如商品ID、分类标签)的场景,可以有效降低fetch阶段的开销。
- 操作
通过docvalue_fields配置仅召回必要字段:
POST my_index/_search
{
"size": 2,
"stored_fields": ["_none_"],
"docvalue_fields": ["my_label"],
"query": {
"vector": {
"my_vector": {
"vector": [1, 1],
"topk": 2
}
}
}
}
- 效果
跳过_source解析,利用列式存储(docvalues)降低fetch阶段开销,提升查询性能。
缓存超时清理
当集群内存资源紧张、数据更新频繁或对数据新鲜度要求较高时,可以启用缓存超时自动清除功能,该功能可以优化系统性能、保障数据一致性和提升稳定性,适用于数据动态变化或内存资源敏感的场景。
执行如下命令设置缓存超时清理:
PUT _cluster/settings
{
"persistent": {
"native.cache.expiry.enabled": "true"
"native.cache.expiry.time": "30m"
}
}
表1 参数说明
参数名称 |
参数类型 |
描述 |
native.cache.expiry.enabled |
Boolean |
控制是否启用缓存超时自动清除功能。
取值范围:
- true:开启超时清除,当缓存项长时间没有被访问过将会被清除。
- false(默认值):关闭超时清除。
|
native.cache.expiry.time |
String |
指定缓存项超时的时间长度。
当“native.cache.expiry.enabled=true”时才生效。
取值范围:时间字符串,例如“24h”(24小时)、“30m”(30分钟)。
默认值:24h |