效能常見問題
如何為 IVF 索引設定nlist
和nprobe
?
設定nlist
需視情況而定。根據經驗,nlist
的建議值是4 × sqrt(n)
,其中n
是段中實體的總數。
每個區段的大小由datacoord.segment.maxSize
參數決定,預設值為 512 MB。網段 n 中的實體總數可以用datacoord.segment.maxSize
除以每個實體的大小來估計。
nprobe
的設定是針對資料集和情境而定,並涉及準確性和查詢效能之間的權衡。我們建議透過反覆的實驗找出理想的值。
以下圖表是在 sift50m 資料集和 IVF_SQ8 索引上執行測試的結果,其中比較了不同nlist
/nprobe
對的召回率和查詢效能。
精確度測試
效能測試
為什麼有時候在較小的資料集上查詢需要較長的時間?
查詢作業是在區段上進行的。索引可減少查詢資料段所需的時間。如果資料段沒有索引,Milvus 就會對原始資料進行暴力搜尋,大大增加查詢時間。
因此,在小型資料集(集合)上查詢通常需要較長的時間,因為它尚未建立索引。這是因為其區段的大小尚未達到rootCoord.minSegmentSizeToEnableindex
所設定的索引建立臨界值。呼叫create_index()
,強制 Milvus 為已達到臨界值但尚未自動建立索引的區段建立索引,可大幅改善查詢效能。
哪些因素影響 CPU 使用量?
當 Milvus 建立索引或執行查詢時,CPU 使用量會增加。一般而言,除了使用 Annoy(在單一線程上執行)外,索引建立都是 CPU 密集型的。
當執行查詢時,CPU 使用量會受到nq
和nprobe
的影響。當nq
和nprobe
較小的時候,並發量會很低,CPU 使用量也會保持在低水平。
同時插入資料和搜尋會影響查詢效能嗎?
插入作業不是 CPU 密集型作業。然而,由於新的區段可能尚未達到建立索引的臨界值,Milvus 會採用強制搜尋,這會嚴重影響查詢效能。
rootcoord.minSegmentSizeToEnableIndex
參數決定段的索引建立臨界值,預設為 1024 行。如需詳細資訊,請參閱系統設定。
索引 VARCHAR 欄位可以提高刪除速度嗎?
為 VARCHAR 欄位建立索引可以加快「Delete By Expression」作業的速度,但僅限於特定情況:
- INVERTED 索引:此索引有助於非主索引鍵 VARCHAR 欄位上的
IN
或==
表達式。 - Trie 索引:此索引有助於非主鍵 VARCHAR 欄位上的前綴查詢 (例如
LIKE prefix%
)。
但是,索引 VARCHAR 欄位並不會加快速度:
- 按 ID 刪除:當 VARCHAR 欄位是主索引鍵時。
- 不相關的表達:當 VARCHAR 欄位不是刪除表達式的一部分時。
還有問題嗎?
您可以