本頁說明如何在 MySQL 適用的 Cloud SQL 執行個體上實作向量搜尋。Cloud SQL 可讓您儲存向量嵌入、建立向量索引,以及與其他儲存的資料一併執行向量搜尋。
向量嵌入儲存空間
您會將向量嵌入內容儲存在符合完整性、一致性、獨立性和耐用性 (ACID) 屬性的表格中。與資料表中的其他關聯資料一樣,您可以使用現有的交易語意,存取資料表中的向量嵌入。
如要在資料表列和向量表示法之間建立對應關係,您需要在資料表中建立資料欄來儲存向量嵌入。資料欄必須使用 VECTOR 資料類型。向量嵌入資料欄只能儲存使用完全相同維度的向量嵌入,也就是您定義資料欄時指定的維度。儲存向量嵌入內容的資料表列數沒有限制。
如果 Cloud SQL 執行個體有足夠的儲存空間和記憶體,您就可以有多個資料表,各自有自己的向量嵌入資料欄。
資料複製的運作方式與其他 MySQL InnoDB 資料欄相同,適用於向量嵌入資料欄。
如要查看向量嵌入資料表、資料欄和 DML 陳述式的限制,請參閱限制。
向量索引
您必須使用向量索引,對向量嵌入執行 ANN 相似度搜尋。Cloud SQL 會使用可擴充的最鄰近項目 (ScANN) 演算法建立向量索引。
向量索引必須符合下列規定:
- 每個資料表只能建立一個向量索引。
- 如果執行個體有多個含有向量嵌入的資料表,您可以為每個資料表建立向量索引。
- 如果您要建立向量索引,就無法在建立索引的資料表主鍵中新增限制。
為提升搜尋品質,請在基礎資料表中載入大量資料後,再建立向量索引。如果基礎資料表中的嵌入內容少於 1000 個,索引建立作業就會失敗。
決定是否要建立向量索引時,如果資料列數量不多,請考慮是否改為執行 KNN 搜尋。決定使用 KNN 或 ANN 搜尋時,也取決於向量嵌入的維度數量。如果嵌入數量較多,可能需要向量索引。
如需向量索引的限制清單,請參閱「限制」。如要瞭解如何建立向量索引,請參閱「建立及管理向量索引」。
向量索引更新
Cloud SQL 會即時更新向量索引。任何對基礎資料表執行資料操縱語言 (DML) 作業的交易,也會將變更傳播至相關聯的向量索引。向量索引的行為與資料表上的任何其他次要索引相同。向量索引完全符合交易一致性,且符合 ACID 標準。如果復原交易,向量索引也會發生相應的復原變更。
複製向量索引
Cloud SQL 會將向量索引複製到所有唯讀備用資源,包括串聯式備用資源。從具有向量嵌入項目的主要執行個體建立新的唯讀備用資源時,唯讀備用資源會繼承主要執行個體的向量嵌入項目設定。如果是現有的唯讀備用資源,則必須在每個資源上啟用向量嵌入支援。
就複製延遲的影響而言,建立及維護向量索引的運作方式與一般 MySQL 索引相同。
持續性、關機和對維護的影響
向量索引的保存方式與基本資料表相同,且完全支援 ACID。向量索引一律會與基本資料表資料同步,並具有相同的可見度、隔離和當機安全性。執行個體關機或維護時,向量索引不會受到影響。
索引維護作業
在基礎資料表上執行大量 DML 作業後,您根據初始資料訓練的向量索引 (建立索引時) 可能無法反映新狀態。這可能會影響搜尋品質。
索引分為兩部分:
- 索引樹狀結構。這項功能是透過現有資料訓練而成。在索引的生命週期內,這項設定不會變更。
- 索引葉節點。這些檔案包含所有資料列。索引葉節點永遠不會不同步。
執行大量 DML 陳述式後,資料列會從一個葉節點移至另一個葉節點,導致索引樹狀結構效率降低。如要重新整理索引樹狀結構,必須重建索引。
不支援對含有向量索引的資料表執行 DDL 作業
如果資料表含有向量索引,則不支援下列資料定義語言 (DDL) 作業。
- 變更需要複製演算法的資料表作業
- 需要重建資料表的 ALTER TABLE 作業
- 捨棄或變更主鍵
- 將表格移至一般表格空間
向量搜尋
Cloud SQL 提供向量距離函式,可用於在執行個體上執行近似近鄰 (ANN) 和 K 近鄰 (KNN) 向量相似度搜尋。執行查詢時,系統會將查詢向量與資料集中的向量進行比較。距離函式會使用餘弦等相似度指標,計算向量之間的距離。向量間的距離越短,相似度就越高,並會顯示在搜尋結果中。
執行 ANN 和 KNN 向量搜尋時,Cloud SQL 會使用下列函式測量向量搜尋中向量之間的距離:
- 餘弦: 測量兩個向量間角度的餘弦值。值越小,表示向量之間的相似度越高。
- 點積: 計算角度的餘弦值,再乘以對應向量大小的乘積。
- L2 平方距離: 測量兩個向量之間的歐幾里得距離,方法是將每個維度的平方距離相加。
KNN 搜尋
如需精確結果或想新增選擇性篩選條件,建議使用 KNN 向量搜尋。KNN 搜尋會計算查詢向量與資料集中每個嵌入項目的距離,找出最接近的鄰居。Cloud SQL 中的 KNN 搜尋功能可提供完美的召回率。 KNN 搜尋不會使用向量索引,因此適合處理較小的資料集。
如要執行 KNN 搜尋,請使用 vector_distance 函式,該函式會將兩個向量做為輸入內容:查詢向量 (您要搜尋的內容) 和資料集中的候選向量。並計算這兩個向量之間的距離。
您會在 SELECT 陳述式中使用 vector_distance。詳情請參閱「搜尋 K 近鄰 (KNN)」。
如果發現 KNN 成效不佳,您可以稍後再建構向量索引,並繼續在應用程式中使用 approx_distance 進行 ANN 搜尋。
ANN 搜尋
如果擔心查詢效率,建議使用 ANN 向量搜尋。這項功能會計算查詢向量與資料集中部分向量之間的距離,加快相似度搜尋速度。為此,Cloud SQL 會將資料整理成叢集或分割區,然後將搜尋範圍集中在最接近查詢的叢集。ANN 搜尋需要向量索引。這些索引會優先考量搜尋速度,而非完美召回。在 Cloud SQL 中,TREE_SQ 索引類型用於 ANN 搜尋。
如要執行 ANN 搜尋,請使用 approx_distance 函式和距離測量選項。您可以在 ORDER BY 或 SELECT 清單中使用 approx_distance,並允許 LIMIT 子句限制搜尋結果。您也可以加入 WHERE 子句,對搜尋結果進行事後篩選。如要進一步控管使用篩選器執行 ANN 搜尋時傳回的結果數量,可以採用疊代篩選。透過疊代式篩選,搜尋查詢可以掃描更多向量索引,直到找到偏好的鄰近項目數量為止,進而傳回更多搜尋結果。
您可以為個別用戶端設定工作階段層級的 cloudsql_vector_iterative_filtering 旗標,或為連線至執行個體的所有用戶端設定全域層級的 ON 旗標,啟用搜尋查詢的疊代篩選功能。
詳情請參閱「搜尋近似最近鄰 (ANN)」。
在某些情況下,ANN 搜尋會改用 KNN 搜尋。詳情請參閱「檢查 ANN 搜尋的備援狀態」。
MySQL 適用的 Cloud SQL 版本向量支援差異
MySQL 適用的 Cloud SQL 在 8.0.36 以上版本中,導入了向量搜尋支援功能。從 MySQL 適用的 Cloud SQL 9.7 版開始,Cloud SQL 已修改特定向量搜尋功能,以便與社群開發的向量支援和儲存功能 (MySQL 9.0 版) 整合。
下表比較了 MySQL 適用的 Cloud SQL 版本,說明版本差異如何影響 MySQL 適用的 Cloud 向量搜尋功能。
| 支援區域 | MySQL 8.4 和更早版本適用的 Cloud SQL | MySQL 9.7 以上版本適用的 Cloud SQL |
|---|---|---|
| 啟用向量 | 如要將向量嵌入內容新增至 MySQL 資料庫並使用向量搜尋功能,您必須將 Cloud SQL 執行個體的 cloudsql_vector 旗標設為 on。 |
如要建立向量索引並執行 ANN 搜尋,請務必將 cloudsql_vector 旗標設為 on。 |
| 表格中的向量嵌入資料欄 | 每個資料表只能有一個向量嵌入資料欄。 | 如果您在資料表上建立索引,則每個資料表只能有一個向量嵌入資料欄。如果未在資料表上建立索引,資料表可以有多個向量嵌入欄。 |
使用 COMMENT 和 CONSTRAINT 識別向量嵌入資料欄 |
為區分向量嵌入資料欄和其他資料欄,Cloud SQL 會在資料欄中加入特殊的 COMMENT 註解和 CONSTRAINT 規則。輸入驗證需要限制條件,且向量嵌入欄註解會顯示為註解。您無法修改或刪除註解或限制。
|
在 MySQL 適用的 Cloud SQL 9.7 中,COMMENT 註解和 CONSTRAINT 規則不再用於識別向量嵌入資料欄。 |
| 維度限制 | 向量嵌入的維度上限為 16,000,沒有預設值。 | 向量嵌入的維度上限為 16,383,預設為 2,048。 |
| 向量儲存格式 |
VARBINARY 格式 |
社群儲存格式 |
| 宣告 vector 資料類型的語法 |
VECTOR(VECTOR_DIMENSIONS)
|
VECTOR(VECTOR_DIMENSIONS)
|
| 轉換函式差異 | vector_to_string 函式的輸出內容會以完整值的形式列印。 |
vector_to_string 函式的輸出內容會以科學記號表示,這是社群標準。 |
限制
下列限制適用於所有支援向量的 Cloud SQL 版本:
- 每個資料表只能有一個向量索引。
- 向量嵌入資料欄不得為產生的資料欄。
- 含有向量嵌入資料欄的資料表不支援資料表層級分區。
- 向量索引不支援使用
BIT、BINARY、VARBINARY、JSON、BLOB、TEXT資料型別或空間資料的主鍵。複合主鍵也不得包含上述任何類型。 - 如有向量索引,就無法在基本資料表的主鍵中新增限制。
- 如果資料表有向量索引,您就無法執行某些 DDL 作業。詳情請參閱不支援對含有向量索引的資料表執行 DDL 作業。
向量搜尋查詢有以下限制:
approx_distance函式只能用於ORDER BY或SELECT清單。- 涉及基礎資料表的述詞可與
ORDER BY或SELECT清單中的approx_distance運算式合併使用,並用於WHERE條件中。WHERE條件述詞會在評估approx_distance向量函式後評估。
後續步驟
- 請參閱 Cloud SQL 向量搜尋總覽。
- 瞭解如何產生向量嵌入。
- 瞭解如何建立向量索引。
- 瞭解如何對向量嵌入執行搜尋。