向量数据库中的删除和更新操作会通过产生空隙或过时数据来影响存储使用,这些数据不会立即被移除。当你删除一个向量时,许多数据库不会立即释放物理存储空间。相反,它们会将该向量标记为无效或“墓碑”,将原始数据保留在原位,直到维护过程清理它们。类似地,更新向量通常涉及写入新版本,同时将旧版本保留在存储中直到被清除。随着时间的推移,这些操作会使存储碎片化并增加未使用的空间,特别是在针对写密集型工作负载优化的系统中。如果不加以干预,这可能导致存储使用效率低下,并因为数据库需要扫描更多数据块而降低查询性能。
为了解决这个问题,许多向量数据库使用压缩(compaction)过程来回收空间。压缩通过将有效向量重写到新的存储块中并丢弃已删除或过时的数据来整合碎片化数据。例如,像 Apache Cassandra 或时序系统这样的数据库应用了类似的逻辑:它们将较小的数据文件合并到较大的文件中,从而消除冗余或过时的条目。在像 Milvus 或 Pinecone 这样的向量数据库中,压缩可能会在后台自动运行,或者手动触发。在压缩期间,系统会根据需要重建索引,以确保查询保持高效。这个过程减少了存储开销并提高了读取性能,但在运行时可能会暂时增加 CPU 和 I/O 使用率。具体情况取决于数据库的设计——有些优先考虑立即回收空间,而有些则批量处理操作以提高效率。
具体行为因实现而异。例如,FAISS(一个用于向量搜索的库)本身不处理删除操作,因此开发者通常会在其之上叠加一个单独的系统来跟踪无效向量并在搜索时排除它们。相比之下,像 Weaviate 或 Qdrant 这样的数据库内部处理删除和更新,使用版本控制或写时复制(copy-on-write)等策略来管理变更。开发者应该查阅其数据库的文档,了解存储回收如何工作。如果压缩不是自动进行的,可能需要手动清理以防止存储膨胀。例如,在 Elasticsearch 的向量搜索功能中,手动优化索引会强制执行类似压缩的过程。理解这些机制对于维护性能和成本效率至关重要,尤其是在存储成本和查询延迟都很重要的规模化应用中。