本文講解MySQL9的3個新特性:支援將JSON輸出儲存到使用者變數、支援準備語句以及支援面向AI的向量儲存。
17.12 MySQL9新特性1——支援將JSON輸出儲存到使用者變數
從MySQL 9版本開始支援將EXPLAIN FORMAT的JSON輸出儲存到使用者變數,下面透過一個案例來理解該新特性。
建立演示資料表tb,SQL語句如下:
CREATE TABLE tb ( id INT, name VARCHAR(25) );
插入演示資料,SQL語句如下:
INSERT INTO tb (id ,name) VALUES (1,'電視機') ,(2,'空調');
將EXPLAIN FORMAT的JSON輸出儲存到使用者變數@myvariable中,SQL語句如下:
EXPLAIN FORMAT =JSON INTO @myvariable UPDATE tb SET name = "洗衣機" WHERE id =2;
檢視使用者變數@myvariable,執行結果如下:
mysql> SELECT @myvariable\G *************************** 1. row *************************** @myvariable: { "query_block": { "select_id": 1, "table": { "update": true, "table_name": "tb", "access_type": "ALL", "rows_examined_per_scan": 2, "filtered": "100.00", "attached_condition": "(`test_db`.`tb`.`id` = 2)" } } }
17.13 MySQL9新特性2——支援準備語句
MySQL 9.0支援準備語句(Prepared Statements),這是一種預編譯的SQL語句,可以包含佔位符,這些佔位符在執行時會被實際的值替換。準備語句的優勢如下:
(1) 準備語句可以提高效能,因為SQL解析和編譯只發生一次,然後可以被多次執行,每次都可以使用不同的引數。
(2) 準備語句能增強應用程式的安全性,因為它們有助於防止SQL隱碼攻擊。
下面透過案例來理解準備語句的使用方法。
使用PREPARE語句準備一個SQL語句模板,該模板可以包含一個或多個佔位符(?)。
mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse'; mysql> PREPARE stmt1 FROM @s;
使用SET語句為佔位符設定具體的值。
mysql> SET @a = 6; mysql> SET @b = 8;
使用EXECUTE語句執行準備好的SQL語句,並用之前設定的引數替換佔位符。
mysql> EXECUTE stmt1 USING @a, @b; +------------+ | hypotenuse | +------------+ | 10 | +------------+
執行完成後,使用DEALLOCATE PREPARE語句釋放準備好的語句。
mysql> DEALLOCATE PREPARE stmt1;
準備語句還可以用於動態選擇需要查詢的表,透過將表名作為使用者變數,並在執行時替換到SQL語句中。例如,透過設定使用者變數@table的值為表名,然後構造一個包含該表名的SQL查詢字串,最後使用PREPARE和EXECUTE語句執行該查詢。這種靈活性使得準備語句在處理動態SQL場景時非常有用。
7.14 MySQL9新特性3——支援面向AI的向量儲存
MySQL 9.0 增加了一個新的向量資料型別:VECTOR。它是一種可以儲存N個資料項的資料結構(陣列),語法格式如下:
VECTOR(N)
其中,每個資料項都是一個4位元組的單精度浮點數。預設的資料項為2048個,最大值為16383。
向量型別的資料可以使用二進位制字串或者列表分隔的字串表示,例如:
CREATE TABLE mytb1(id int, rgb vector(3)); INSERT INTO mytb1 VALUES (1, to_vector('[255,255,255]')); INSERT INTO mytb1 VALUES (2, to_vector('[128,255,0]')); INSERT INTO mytb1 VALUES (3, to_vector('[0,65,225]'));
MySQL 9.0 同時還增加了一些用於操作VECTOR資料的向量函式。
1. STRING_TO_VECTOR 函式
STRING_TO_VECTOR 函式用於將字串形式的向量資料轉換為二進位制,STRING_TO_VECTOR 函式的引數是一個字串,包含一組由逗號分隔的浮點數,並且使用方括號([])進行引用。例如:
mysql> SELECT HEX(STRING_TO_VECTOR("[1.08, -18.8, 88]")); +--------------------------------------------+ | HEX(STRING_TO_VECTOR("[1.08, -18.8, 88]")) | +--------------------------------------------+ | 713D8A3F666696C10000B042 | +--------------------------------------------+
2. VECTOR_TO_STRING 函式
VECTOR_TO_STRING 函式用於將向量資料轉換為字串。例如:
mysql> SELECT VECTOR_TO_STRING(STRING_TO_VECTOR("[1.08, -18.8, 88]")); +---------------------------------------------------------+ | VECTOR_TO_STRING(STRING_TO_VECTOR("[1.08, -18.8, 88]")) | +---------------------------------------------------------+ | [1.08000e+00,-1.88000e+01,8.80000e+01] | +---------------------------------------------------------+ mysql> SELECT VECTOR_TO_STRING(0x00000040000040444000A0400000E400); +------------------------------------------------------+ | VECTOR_TO_STRING(0x00000040000040444000A0400000E400) | +------------------------------------------------------+ | [2.00000e+00,7.68000e+02,5.00003e+00,2.09385e-38] | +------------------------------------------------------+
輸出結果中的浮點數使用科學計數法表示。
3. VECTOR_DIM 函式
VECTOR_DIM 函式用於返回向量資料的維度,也就是資料項的個數。例如:
mysql> SELECT VECTOR_DIM(rgb) FROM mytb1; +-----------------+ | VECTOR_DIM(rgb) | +-----------------+ | 3 | | 3 | | 3 | +-----------------+