一文看完MySQL 9.0新特性!

本文总结自 MySQL 8.4 以来,在 MySQL 9.0 中新增、废弃、更改和删除的内容。MySQL 9.0 中新增或更改的功能。

1 MySQL 9.0新特性

1 VECTOR 类型支持

MySQL 9.0 支持 VECTOR 列类型。向量是一个数据结构,它由条目列表(4 字节浮点值)组成,可以表示为二进制字符串值或列表格式字符串。VECTOR 列在声明时需指定最大长度或条目数量(括号内),默认值为 2048,最大值为 16383。

可用以下示例,通过 CREATE TABLE 创建带有 VECTOR 列的 InnoDB 表:

mysql> CREATE TABLE v1 (c1 VECTOR(5000));
Query OK, 0 rows affected (0.03 sec)

向量列的限制

  • VECTOR 列不能用作任何类型的键。这包括主键、外键、唯一键和分区键。

  • 某些类型的 MySQL 函数和运算符不接受向量作为参数。这些函数包括但不限于数值函数和运算符、时间函数、全文搜索函数、XML 函数、位函数和 JSON 函数。

    向量可以与某些但非所有字符串和加密函数一起使用

  • VECTOR 不能与任何其他类型进行比较,并且只能与另一个 VECTOR 进行相等性比较

VECTOR_DIM()(也在 MySQL 9.0 中新增)返回向量的长度。提供了用于不同表示之间转换的函数。STRING_TO_VECTOR()(别名:TO_VECTOR())采用列表格式表示的向量并返回二进制字符串表示;VECTOR_TO_STRING()(别名:FROM_VECTOR())执行相反的操作,如下所示:

mysql> SELECT STRING_TO_VECTOR('[2, 3, 5, 7]');
+------------------------------------------------------+
| TO_VECTOR('[2, 3, 5, 7]')                            |
+------------------------------------------------------+
| 0x00000040000040400000A0400000E040                   |
+------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040);
+------------------------------------------------------+
| VECTOR_TO_STRING(0x00000040000040400000A0400000E040) |
+------------------------------------------------------+
| [2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00]    |
+------------------------------------------------------+
1 row in set (0.00 sec)

2 内联和隐式外键约束

MySQL 现在强制执行内联外键规范,这在以前版本中被解析器接受但忽略。MySQL 9.0 还接受对父表主键列的隐式引用。

考虑以下通过该语句创建的父表 person

CREATE TABLE person (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name CHAR(60) NOT NULL
);

若要创建具有 person 外键 owner 的表 shirt,MySQL 现在根据标准接受并正确处理以下任何一种 CREATE TABLE 语句:

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL,
    
    FOREIGN KEY (owner) REFERENCES person (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL,
    
    FOREIGN KEY (owner) REFERENCES person
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person (id)
);

CREATE TABLE shirt (
    id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    style ENUM('tee', 'polo', 'dress') NOT NULL,
    color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
    owner SMALLINT UNSIGNED NOT NULL REFERENCES person
);

以前版本的 MySQL 中,只有上述显示的第一个语句会创建外键。

3 将 EXPLAIN ANALYZE 的 JSON 输出保存到变量中

现在支持将 EXPLAIN ANALYZEJSON 输出保存到用户变量中,语法如下所示:

EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt

随后可以将该变量作为 MySQL JSON 函数的 JSON 参数使用。INTO 子句仅支持 FORMAT=JSON,且必须显式指定 FORMAT。此形式的 EXPLAIN ANALYZE 还支持可选的 FOR SCHEMAFOR DATABASE 子句。

注意:仅当 explain_json_format_version 服务器系统变量设置为 2 时,此功能才可用;否则,尝试使用它将引发 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED 错误(EXPLAIN ANALYZE 在 explain_json_format_version=1 的情况下不支持 FORMAT=JSON)。

4 准备语句中的事件 DDL

从 MySQL 9.0.0 开始,以下语句可以进行准备:

这些语句不支持位置参数(? 占位符);必须使用字符串字面值、系统变量和用户变量的某种组合来组装准备语句的文本。一种实现可重用性的方法是,在存储过程的主体中组装例如 CREATE EVENT 语句的文本,并将该语句的任何变量部分作为 IN 参数传递给存储过程;使用 PREPARE 准备组装的文本;使用所需的参数值调用过程。

5 性能模式系统变量表

MySQL 9.0 为性能模式新增了两个表,这些表提供有关服务器系统变量的信息。列表如下:

  • variables_metadata 表提供了有关系统变量的一般信息。此信息包括 MySQL 服务器识别的每个系统变量的名称、范围、类型、范围(如果适用)和描述。

    此表中的两列(MIN_VALUEMAX_VALUE)旨在替换 variables_info 表中已废弃的列。

  • global_variable_attributes 表提供有关服务器分配给全局系统变量的属性-值对的信息。

6 EXPLAIN FORMAT=JSON 的增强功能

EXPLAIN FORMAT=JSON 的输出现在包括有关连接列的信息。

7 包含 LIMIT 1 的相关子查询

以前,为了有资格转换为带派生表的外部左连接,子查询不能包含 LIMIT 子句。在 MySQL 9.0 中,此限制略微放宽,使得包含 LIMIT 1 的子查询现在可以以这种方式进行转换。

LIMIT 子句必须仅使用字面值 1。如果 LIMIT 子句包含其他值,或者使用占位符 (?) 或变量,则无法使用子查询到派生表的转换进行优化。

以下是在 MySQL 9.0 中废弃的功能:

2 MySQL 9.0 中废弃的功能

以下功能在 MySQL 9.0 中被废弃,可能会在未来的版本中被移除。对于显示的替代方案,应用程序应更新以使用它们。
对于使用在 MySQL 9.0 中被废弃、在后续版本中移除的功能的应用程序,当从 MySQL 9.0 源复制到运行后续版本的副本时,语句可能会失败,或者源和副本上的效果可能不同。为了避免这些问题,使用在 9.0 中被废弃功能的应用程序应进行修订,以避免使用它们,并在可能的情况下使用替代方案。

性能模式 variables_info 表列

性能模式的 variables_info 表中的 MIN_VALUEMAX_VALUE 列现在被废弃,并可能在未来的 MySQL 版本中被移除。相反,请使用 variables_metadata 表的列,这些列具有相同的名称。

更新事务性和非事务性表的事务

MySQL 9.0 废弃了同时更新事务性表和非事务性或非组合表的事务。这样的事务现在会在客户端和错误日志中写入一个废弃警告。只有 InnoDBBLACKHOLE 存储引擎是事务性和组合性的(NDBCLUSTER 是事务性的但不是组合性的)。这意味着只有以下存储引擎的组合不会引发废弃警告:

  • InnoDBBLACKHOLE
  • MyISAMMerge
  • performance_schema 和任何其他存储引擎
  • TempTable 和任何其他存储引擎

3 MySQL 9.0 中移除的功能

以下项目已过时,并在 MySQL 9.0 中被移除。对于显示的替代方案,应用程序应更新以使用它们。
对于在 MySQL 8.4 中使用在 MySQL 9.0 中移除的功能的应用程序,当从 MySQL 8.4 源复制到 MySQL 9.0 副本时,语句可能会失败,或者源和副本上的效果可能不同。为了避免这些问题,使用在 MySQL 9.0 中移除功能的应用程序应进行修订,以避免使用它们,并在可能的情况下使用替代方案。

mysql_native_password 插件

MySQL 8.0 中被废弃的 mysql_native_password 认证插件已被移除。服务器现在拒绝来自没有 CLIENT_PLUGIN_AUTH 能力的旧客户端程序的 mysql_native 认证请求。
由于这个更改,以下服务器选项和变量也已移除:

  • --mysql-native-password 服务器选项
  • --mysql-native-password-proxy-users 服务器选项
  • default_authentication_plugin 服务器系统变量

为了向后兼容,mysql_native_password 在客户端仍然可用,这样 MySQL 9.0 客户端程序可以连接到早期版本的 MySQL 服务器。在 MySQL 9.0 中,以前版本的客户端程序内置的 MySQL 本地认证插件已转换为在运行时必须加载的插件。

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化
  • 活动&券等营销中台建设
  • 交易平台及数据中台等架构和开发设计
  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化
  • LLM Agent应用开发
  • 区块链应用开发
  • 大数据开发挖掘经验
  • 推荐系统项目

目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

本文由博客一文多发平台 OpenWrite 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容