MySQL9的3個新特性

brucexia發表於2024-10-08

本文講解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    |
+-----------------+

相關文章