Milvus重复更新相同数据时total_rows与indexed_rows持续增长的原因
Milvus Upsert 统计信息与count()结果不一致的原因
核心原因:Milvus的MVCC多版本机制
Milvus采用MVCC(多版本并发控制)保障读写并发一致性,执行upsert操作时:
- 对已存在主键的记录,不会直接覆盖旧数据,而是插入新的记录版本,并将旧版本标记为墓碑(tombstone)状态
- 集合统计信息里的
total_rows和indexed_rows统计的是所有物理存储的记录(包括被标记删除的旧版本),因此每次upsert相同的1000条记录,都会新增1000条新记录版本,统计数值就会每次增加1000
count()结果正确的原因
count()查询会自动过滤掉所有被标记为墓碑的旧版本记录,只统计当前有效的数据行,所以无论执行多少次upsert,有效记录始终是1000条,count()返回结果保持不变。
验证与同步统计信息的方法
如果想要让统计信息的数值和有效记录数一致,可以手动触发Milvus的**数据压缩(compaction)**操作,清理掉已标记的旧版本记录:
# 使用Python SDK手动触发compaction from pymilvus import Collection collection = Collection("your_collection_name") collection.compaction()
执行compaction后,再次查看集合统计信息,total_rows和indexed_rows会更新为当前有效的1000条记录。
内容的提问来源于stack exchange,提问作者tmandyai
相关产品推荐
相关产品推荐

