Single-Store Vector Index: Architecture and Memory Efficiency

Bài tóm tắt Memgraph 2026 2. Tăng trưởng Độ khó: Trung bình

Memgraph · 2026 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Bài nhà cung cấp; benchmark tự chạy trên một kịch bản (1 triệu node, 1024 chiều). Mọi nhận định ghi "theo Memgraph".

Bối cảnh

  • Memgraph là graph DB trong bộ nhớ. Vector search ở quy mô hàng triệu node với embedding nhiều chiều làm RAM thành nút thắt.
  • Lựa chọn kiến trúc: vector index không phải service hay kho riêng mà là một loại index trong cùng storage engine với đỉnh, cạnh và các index khác.

Thay đổi chính

  • Một kho, một câu chuyện bền vững: snapshot và WAL phủ cả đồ thị lẫn mọi index; khôi phục dựng lại vector index cùng lượt với dữ liệu, không phải phát lại một kho vector riêng. Cập nhật đồ thị và index do cùng tầng storage điều phối; riêng tìm vector dùng READ_UNCOMMITTED cho hiệu năng, phần còn lại vẫn theo delta và mức cô lập thường. Không phải đồng bộ giữa graph DB và vector store.
  • Cấu trúc: dựa trên thư viện USearch (C++), đồ thị kiểu HNSW trên các slot vector. Thư viện không tự tạo thread mà mượn thread của bên gọi qua một vòng thread slot cố định, nên Memgraph chia tập đỉnh cho các worker để dựng và khôi phục song song. Khoá theo từng node của đồ thị chứ không một mutex toàn cục. Khoảng cách tính bằng SIMD (SimSIMD, nếu không có thì để compiler tự vector hoá).
  • Khoá của index là con trỏ tới đỉnh trong bộ nhớ: tìm xong trả thẳng đỉnh, không có lớp ánh xạ ID, index không phải chứa ID hay metadata của đồ thị.
  • Không lưu hai bản: khi thuộc tính được vector index phủ, property store chỉ giữ tham chiếu tới index (nhiều index thì nhiều tham chiếu); bản vector chính thức nằm trong index. Khi đỉnh rời index (bỏ label, drop index) vector được chuyển ngược về property store để không mất dữ liệu, nên RAM có thể tăng lúc đó.
  • Scalar kind chọn khi tạo index (f32, f16, bf16, f8): đòn bẩy bộ nhớ chính, đánh đổi độ chính xác.
  • Kết quả (theo Memgraph, 1 triệu node × 1024 chiều): f32 từ 14,43 GB (bản 3.7.2) xuống 4,85 GB (3.8.0), giảm khoảng 66%; f16 từ 12,52 GB xuống 3,00 GB, giảm khoảng 76%; thời gian nạp index không đổi. Nền không có vector index khoảng 660–775 MB ở cả hai bản.

Vì sao

  • Theo Memgraph, đặt vector index trong cùng engine bỏ được việc đồng bộ hai hệ, nhưng buộc index phải tiết kiệm bộ nhớ tối đa vì giành RAM với đồ thị.

Bài học cho SWE

  • Nhúng index vector vào DB chính đổi một bài toán phân tán (đồng bộ hai kho) lấy một bài toán tài nguyên (RAM chung); bản đầu của Memgraph tốn gấp ba bản sau cho cùng dữ liệu.
  • Mức cô lập có thể khác nhau theo loại truy cập trong cùng một DB; cần ghi rõ chỗ nào nới.

Liên quan