SQL Vector Index 向量索引與優化
當資料量達到數萬甚至數百萬筆時,對每一筆資料計算向量距離(暴力掃描)會導致查詢時間從毫秒級飆升至秒級。為了讓 AI 搜尋具有實用性,我們必須使用特殊的向量索引。
核心概念:ANN (近似最近鄰)
與傳統 B-Tree 索引(尋找 100% 精確值)不同,向量索引通常基於 ANN (Approximate Nearest Neighbors)。
- 為什麼?:在高維度空間中,找到絕對的最近鄰極度耗時。
- 代價:為了極致的速度,我們會犧牲一點點的精準度(召回率 Recall)。例如,100% 精確搜尋需要 5 秒,但 99% 精確的 ANN 搜尋只需要 5 毫秒。
PostgreSQL (pgvector) 的索引實作
PostgreSQL 是目前 SQL 領域中向量索引最成熟的解決方案,主要提供兩大演算法:
1. IVFFlat (Inverted File Index)
IVFFlat 將向量空間劃分為多個聚類 (Lists)。搜尋時只檢查最接近的幾個清單。
- 適用場景:記憶體有限、資料更新頻繁、或對精準度要求適中的情況。
- 關鍵參數:
lists。建議設為資料行數 / 1000(對於 100 萬行,設為 1000)。
-- 建立索引
CREATE INDEX ON articles USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- 查詢優化:搜尋更多聚類中心以提升精準度
SET ivfflat.probes = 10;
2. HNSW (Hierarchical Navigable Small Worlds)
HNSW 建立一個多層網絡。它像地圖一樣,先在大範疇移動,再精確定位。
- 適用場景:生產環境的首選。提供極高的召回率與極快的搜尋速度。
- 關鍵參數:
m(每節點連線數)、ef_construction(建立時的搜尋深度)。
-- 建立 HNSW 索引
CREATE INDEX ON articles USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 查詢優化:ef_search 越大越準,但越慢
SET hnsw.ef_search = 100;
MySQL 的索引現況與展望
在 MySQL 8.4+ 核心版本中,向量索引目前仍處於持續演進階段。
- MySQL HeatWave (雲端版):支援高效的向量索引與自動轉置,適合大規模 AI 應用。
- Community Edition (社群版):目前尚未內建與 HNSW 完全等效的索引。在此之前,常見的優化手段是:
- 預先篩選:利用
WHERE子句的其他 B-Tree 索引欄位(如user_id)將資料範圍縮小,再進行向量運算。 - 函數索引:針對向量的某些關鍵特徵建立索引(Workaround)。
- 預先篩選:利用
Azure SQL / SQL Server 的原生索引
微軟在最近的更新中為 Azure SQL 引入了內建的向量索引支援 (Preview)。
建立 HNSW 向量索引
SQL Server 採用的 HNSW 實作經過磁碟 I/O 優化:
CREATE INDEX idx_vector ON TableName (VectorColumn)
WITH (INDEX_TYPE = HNSW);
SQL Server 的向量索引會自動處理不同的距離指標(如 Cosine 或 Euclidean),開發者不需要像 PostgreSQL 那樣手動指定
_ops。效能調優策略:三元平衡
在實務中,你需要根據業務需求調整以下三個面向:
- Recall (召回率):檢索結果中有多少比例是真正的「最近鄰」。
- Latency (延遲):單次搜尋所需的時間 (ms)。
- Throughput (吞吐量):系統每秒能處理多少次查詢。
調優 Checklist:
- 硬體資源:HNSW 索引非常消耗記憶體 (RAM),確保資料庫伺服器有足夠的緩存。
- 正規化:存入向量前執行正規化(將模長轉為 1),能讓 Inner Product 計算快上許多。
- 索引重建:資料大量刪除或變更後,IVFFlat 索引的精準度會下降,建議定期重新建立索引。
總結
- 小數據 (< 10,000):不需索引,暴力掃描最準。
- 追求極速 (PostgreSQL):首選 HNSW。
- 追求成本效益 (PostgreSQL):選擇 IVFFlat。
- MySQL/SQL Server 用戶:優先利用
WHERE子句篩選資料範圍,並關注最新的 HNSW 支援更新。
透過掌握向量索引,你就能讓資料庫在處理海量 AI 資料時,依然保持如閃電般的反應速度!