MySQL 9.0 正式版已經發布,其中一個亮點就是向量(VECTOR)數據類型的支持,本文給大家詳細介紹一下這個新功能。
向量類型
MySQL 9.0 增加了一個新的向量數據類型:VECTOR。它是一種可以存儲 N 個數據項的數據結構(數組),定義方式如下:
VECTOR(N)
其中,每個數據項都是一個 4 字節的單精度浮點數。默認的數據項為 2048 個,最大值為 16383。
向量類型的數據可以使用二進制字符串或者列表分隔的字符串表示,例如:
CREATE TABLE t(id int, rgb vector(3));INSERT INTO t VALUES (1, to_vector('[255,255,255]'));
INSERT INTO t VALUES (2, to_vector('[128,255,0]'));
INSERT INTO t VALUES (3, to_vector('[0,65,225]'));
向量函數
MySQL 9.0 同時還增加了一些用于操作 VECTOR 數據的向量函數。
首先,STRING_TO_VECTOR 函數用于將字符串形式的向量數據轉換為二進制,例如:
SELECT HEX(STRING_TO_VECTOR("[1.05, -17.8, 32]"));HEX(STRING_TO_VECTOR("[1.05, -17.8, 32]"))|
------------------------------------------+
6666863F66668EC100000042 |
STRING_TO_VECTOR 函數的參數是一個字符串,包含一組由逗號分隔的浮點數,并且使用方括號([])進行引用。
TO_VECTOR 函數是 STRING_TO_VECTOR 函數的同義詞。
其次,VECTOR_TO_STRING 函數用于將向量數據轉換為字符串,例如:
SELECT VECTOR_TO_STRING(STRING_TO_VECTOR("[1.05, -17.8, 32]"));VECTOR_TO_STRING(STRING_TO_VECTOR("[1.05, -17.8, 32]"))|
-------------------------------------------------------+
[1.05000e+00,-1.78000e+01,3.20000e+01] |SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040);VECTOR_TO_STRING(0x00000040000040400000A0400000E040)|
----------------------------------------------------+
[2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00] |
輸出結果中的浮點數使用科學計數法表示。
FROM_VECTOR 函數是 VECTOR_TO_STRING 函數的同義詞。
最后,VECTOR_DIM 函數用于返回向量數據的維度,也就是數據項的個數。例如:
SELECT VECTOR_DIM(rgb) FROM t;VECTOR_DIM(rgb)|
---------------+3|3|3|
使用限制
VECTOR 數據類型存在以下限制:
- VECTOR 數據不能和其他類型的數據進行比較,VECTOR 數據只能和其他 VECTOR 數據進行等值比較。
- VECTOR 類型的字段不能作為任何類型的鍵值,包括主鍵、外鍵、唯一鍵以及分區鍵。
- VECTOR 類型的字段不能作為直方圖的統計源。
- 一些 MySQL 字符串函數可以使用 VECTOR 數據作為參數,包括 BIT_LENGTH()、CHAR_LENGTH()、HEX()、LENGTH() 以及 TO_BASE64()。其他字符串函數不支持 VECTOR 類型的參數。
- VECTOR 數據可以作為以下加密函數的參數:AES_ENCRYPT()、COMPRESS()、MD5()、SHA1()、SHA2()。其他加密函數不支持 VECTOR 類型的參數。
- VECTOR 數據可以作為 CASE 運算符和 COALESCE()、IFNULL()、NULLIF() 以及 IF() 函數的參數。
- VECTOR 數據可以作為 CAST(expression AS BINARY) 的參數,結果返回 VECTOR 數據的二進制字符串。CAST 函數不支持將數據轉換為 VECTOR 類型,推薦使用 STRING_TO_VECTOR 函數。
- 除了COUNT 函數之外,VECTOR 數據類型不能作為其他聚合函數或者窗口函數的參數。
- VECTOR 數據不能作為以下函數或運算符的參數:數字函數和運算符、時間函數、全文檢索函數、XML 函數、位操作函數以及 JSON 函數。
總結
首先,對于向量數據的支持是一個重大的改進,可以為 MySQL 增加向量存儲功能。
不過,目前 MySQL 9.0 只有簡單的 VECTOR 數據類型和轉換函數,還沒有提供向量相似度(余弦相似性、歐氏距離、內積相似性等)檢索功能,以及優化查詢性能的向量索引,距離一個實用的向量數據庫還有一些差距。