當前位置: 華文世界 > 科技

MySQL 9.1正式釋出,有哪些值得關註的新特性?

2024-10-24科技

MySQL創新版9.1.0於2024年10月15日正式釋出。此外,MySQL8.0.40及8.4.3修補程式版本也同時釋出。8.4.3是目前MySQL的LTS長期支持版本,該版本中將不會增加新的功能與特性,僅提供錯誤修復。新功能與新特性僅在創新版中釋出。讓我們一起快速瀏覽一下9.1.0中有哪些新的內容。

DDL原子性: MySQL已經支持DDL操作的原子性,但是在之前版本中的「CREATE DATABASE」 和 「DROP DATABASE」並沒有實作真正的崩潰安全,原因在於當作業系統上的資料庫目錄建立後如果「CREATE DATABASE」語句沒有成功送出,該目錄並不會刪除,需要手動進行刪除,反之,目錄刪除後,「DROP DATABASE」沒有成功送出會造成系統錯誤。該問題已經在新版本中解決。

審計和防火墻 :在之前的版本中,審計和防火墻功能會認為非字母開頭的使用者名稱稱為無效使用者,例如,「$foo」。在該版本中已解決該問題。

關於編譯 :編譯部份中修復了大量的相容性問題,並作出一些改進,其中「SQL_I_list」 使用成員欄位 「next」 來跟蹤指向下一個物件的指標,該指標欄位在構造列表物件時初始化為成員欄位的地址。預設的設定運算子采用的是成員級賦值,只有使用常規建構函式構造的列表物件才適用,這不適用於空列表。因此,新版本透過提供自訂的移動建構函式和賦值操作符函式來解決這個問題。此外,新版本還將「save_and_clear()」的實作更改為使用「std::move()」而不是賦值操作。感謝騰訊團隊和Xingyu Yang對該修復的貢獻。

SQL函式與操作

新版本解決了當將DATABASE()函式用作 UNION 查詢的一部份時輸出被截斷問題。

在某些情況下,當使用DISTINCT時,相同的值進行SUM()會產生不同的結果。例如,

mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');+--------------+-----------------------+| sum(b'1100') | sum(DISTINCT b'1100') |+--------------+-----------------------+|12 |9 |+--------------+-----------------------+

這是因為在使用「DISTINCT」時,會建立一個臨時的表用於保存值,以便在最後將產生唯一的值返回給使用者。之前建立這樣的表時,沒有考慮到已經確定的數據型別和長度,對它們重新計算。現在則考慮已經確定的數據型別和長度。

JavaScript:

  • JavaScript儲存程式使用預設的utf8mb4字元集,但INFORMATION_SCHEMA.ROUTINES中COLLATION_CONNECTION列之前顯示的值是「latin1」,現在改為「Utf8mb4_0900_ai_ci」 (utf8mb4的預設排序規則)
  • 當預處理語句返回一個BLOB值時,該BLOB值在預處理語句被釋放後失效,新版本修復了該錯誤。
  • 在使用Statement控制代碼介面的儲存過程中,如果DML使用使用者變量,有時會導致在該儲存過程執行後,執行其他語句使得伺服器意外結束。為了解決該問題,新版本在執行控制代碼介面中的子語句後,重設用於儲存使用者變量及其值到語句執行的根記憶體。
  • SqlResult不支持叠代:現在可以用下面所示的方式遍歷結果集:

  • let result = session.runSql("SELECT * FROM t")for (let row of result) {console.log(row.c1+row.c3);}

    JavaScript現在完全支持VECTOR型別儲存程式。向量現在可以用作輸入參數,輸出參數,預處理語句bind()參數,並返回值。

    Keyring

    從所有MySQL密匙環相關的元件中移除 對不安全的AES ECB的支持。

    可插拔認證

    「SET PERSIST」中解決了「Authentication_ldap_simple_bind_root_pwd =password」沒有實際保存密碼的錯誤。

    SQL語法

  • 「SELECT test. dat . A FROM (SELECT 1 as A) as Dt」使用如下格式「db_name.tbl_name」標識衍生表中的列。盡管這種行為與SQL標準矛盾,但該參照也在運算式中被錯誤 地接受了。現在不允許使用這樣的列參照。

  • 在此版本中增加了對「IF NOT EXISTS」子句與CREATE VIEW語句一起使用的支持。IF NOT EXISTS的作用如下:

  • 如果語句中指定的檢視不存在,視影像往常一樣被建立。如果檢視已經存在,則語句將顯示成功,但不會更改檢視定義,並且產生一個警告,如下所示:

  • mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;Query OK, 0 rows affected (0.01 sec)mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;ERROR 1050 (42S01): Table 'v1' already existsmysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> SHOW WARNINGS;+-------+------+---------------------------+| Level | Code | Message|+-------+------+---------------------------+| Note | 1050 | Table 'v1' already exists |+-------+------+---------------------------+1 row in set (0.00 sec)mysql> SHOW CREATE VIEW v1\G*************************** 1. row *************************** View: v1 Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`vuser`@`localhost` SQLSECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c3` AS `c3` from `t1`character_set_client: utf8mb4collation_connection: utf8mb4_0900_ai_ci1 row in set (0.00 sec)

    「IF NOT EXISTS」與「OR REPLACE」不相容,並且這兩個從句不能同時使用「CREATE VIEW」語句。嘗試這樣做會導致語句將以語法錯誤被拒絕。

    向量數據型別 :STRING_TO_VECTOR()函式現在允許在VECTOR參數的字串表示形式中尾隨空格。解析器現在會在數位之後、方括弧之前、方括弧之後或這些值的任何組合中裁剪空白字元。一些以前不支持的值現在被允許的例子如下:

    "[1 ,2]""[1,2 ]"" [1,2]""[1,2] "

  • 系統上少於32個邏輯處理器的參數「innodb_log_writer_threads」的預設值現在為「OFF」。

  • 組復制 :在下列情況下添加了新的INFO級別日誌訊息:

    1、當一個動作開始在所有節點

    2、當發送訊息被阻塞而等待完成動作

    3、當收到訊息和內部訊息時計數器遞減

    為了保持輸出的一致性,當「explain_json_format_version=2」,以及當使用「EXPLAIN FORMAT=」TREE時, 「EXPLAIN FORMAT=JSON」為「lookup_condition」所顯示的條件中的「=」符號前後都添加了空格。

  • 「EXPLAIN FORMAT=TREE」的輸出中現在包含了所使用的半連線策略資訊。
  • 新版本可以啟用或禁用遙測數據,在伺服器啟動時,從命令列或配置檔中使用「performance-schema-meter」參數。
  • 當MRR用於MRR和索引範圍掃描存取路徑時,如果「 explain_json_format_version」設定為2時,「EXPLAIN FORMAT=JSON」輸出增加「multi_range_read」:true
  • 為「mysql」客戶端增加了」--system-command「選項。啟用或禁用系統客戶端命令,該選項的預設值為」OFF「。
  • 該版本實作了以下兩個狀態變量,用於跟蹤內部臨時表從記憶體到磁盤的轉換:
  • 「TempTable_count_hit_max_ram」全域變量,用於統計到達」temptable_max_ram「限制導致的記憶體到磁盤表的轉換數量。
  • 」Count_hit_tmp_table_size「統計記憶體到磁盤的轉換數量,到達「tmp_table_size」限制,或者達到Tmp_table_size 和max_heap_table_size較小的值。

  • 「 TOTAL_ROW_VERSIONS」 的最大值由64變為255. 該值透過執行」ADD COLUMN「遞增以及使用」INSTANT ALGORITHM「的」DROP COLUMN「操作。
  • MySQL OpenTelemtry元件現在支持匯出遙測日誌數據到OpenTelemetry日誌采集器分析。
  • 以上內容是MySQL9.1.0為大家帶來的新內容,除此之外還有大量的錯誤修復,詳細資訊請存取官網手冊。