MySQL 9.0.0 新特性解读:向量类型、JavaScript 存储程序与重大变更
⚠️ 重要提示
MySQL 9.0.0 因一个严重问题(创建 8001 张及以上表后服务器无法重启)已被官方撤回,请直接使用 9.0.1 或更高版本。本文内容基于 9.0.0 的变更日志,但大部分特性在 9.0.1 中依然保留并修复了该问题。
## 一、核心亮点:两个重量级新功能
### 1. VECTOR 向量数据类型(预览版)
MySQL 9.0.0 引入了 VECTOR 列类型,用于存储浮点数列表(每个元素 4 字节),最大维度为 16383(默认 2048)。
它专为AI 语义搜索、向量相似度计算等场景设计,为后续的向量索引和近似最近邻(ANN)搜索打下基础。
-- 创建带向量列的表
CREATE TABLE v1 (c1 VECTOR(5000));
-- 转换函数
SELECT STRING_TO_VECTOR('[2,3,5,7]'); -- 转二进制
SELECT VECTOR_TO_STRING(0x...); -- 转可读字符串
限制(9.0.0 中):
- 不能用作任何类型的键(主键/外键/分区键)
-
- 不支持大部分数值/时间/JSON 函数
-
- MLE JavaScript 程序和 NDB Cluster 暂不支持
### 2. JavaScript 存储程序(企业版)
仅限 MySQL 企业版。现在可以用 JavaScript 编写存储过程/函数,基于 ECMAScript 2023 规范,默认严格模式:
CREATE FUNCTION gcd(a INT, b INT)
RETURNS INT
LANGUAGE JAVASCRIPT AS
$mle$
let x = Math.abs(a);
let y = Math.abs(b);
while(y) {
var t = y;
y = x % y;
x = t;
}
return x;
$mle$;
支持 SQL API、会话管理函数(mle_session_state/reset)等。
不支持 VECTOR 类型。
## 二、重要的破坏性变更(升级必看)
### ???? 1. 移除 mysql_native_password 认证插件
该插件已在 8.0 中弃用,9.0 中完全移除
服务器不再接受不带 CLIENT_PLUGIN_AUTH 能力的旧客户端发起的 mysql_native 认证请求
移除相关选项:--mysql-native-password、--mysql-native-password-proxy-users、default_authentication_plugin
客户端侧仍保留为动态加载插件(向后兼容)
### ⚠️ 2. 事务中混合更新事务表和非事务表转为弃用警告
今后在同一个事务里同时更新 InnoDB(或 BLACKHOLE)与 MyISAM 等非事务表,会触发弃用警告(写入客户端和错误日志)。
未来版本可能直接报错。
### 3. ER_SUBQUERY_NO_1_ROW 不再被 IGNORE 忽略
带有 IGNORE 的 INSERT/UPDATE/DELETE 语句,如果包含返回多行的标量子查询,现在会直接报错,不再静默插入 NULL 或忽略。
### 4. Performance Schema 表列弃用
variables_info 表的 MIN_VALUE / MAX_VALUE 列已弃用,请改用新增的 variables_metadata 表(见后文)
## 三、SQL 语法增强
### ???? 内联外键正式支持
以前被解析但忽略的内联外键引用(REFERENCES 子句在列定义内)现在真正生效。同时支持省略引用列名(自动引用父表主键)。
-- 以下写法现在都正确创建外键
FOREIGN KEY (owner) REFERENCES person (id);
owner SMALLINT UNSIGNED REFERENCES person (id);
FOREIGN KEY (owner) REFERENCES person; -- 隐式使用主键
### EXPLAIN ANALYZE 可将 JSON 结果存入变量
EXPLAIN ANALYZE FORMAT=JSON INTO @variable SELECT ...;
需设置 explain_json_format_version = 2。之后可用 JSON_EXTRACT(@variable, ...) 分析。
### 更多语句支持准备(PREPARE)
CREATE EVENT、ALTER EVENT、DROP EVENT 现在可以被预编译(但不支持 ? 占位符)。
## 四、性能与优化器改进
相关子查询带 LIMIT 1:可优化为外连接派生表(此前含 LIMIT 的子查询无法转换)
EXPLAIN FORMAT=JSON 输出中增加了连接列信息
并行读取优化:修复了 innodb_parallel_read_threads=1 时性能急剧下降的问题
直方图后台更新:错误日志消息被限制为每分钟最多 1 条,避免刷屏
## 五、Performance Schema 新增表
|表名| 作用|
|variables_metadata| 提供系统变量的元数据:名称、作用域、类型、取值范围、描述(替代 variables_info 的 min/max 列)|
|global_variable_attributes |记录服务器分配给全局系统变量的属性-值对|
## 六、其他值得关注的变更
### ???? 审计日志
修复了大文件(≥200MB)下 audit_log_read() 过慢的问题
日志修剪功能在文件被删除/改名后不再中断,仅打印警告
### 复制与组复制
当 replica_parallel_workers=1 时不再错误停止,只记录警告
修复了 binlog_rows_query_log_events 可能因二进制零截断查询字符串的问题
组复制中修复了网络空闲超时 20 秒导致备机意外退出的 bug
### 编译与打包
Boost 升级至 1.85.0,gRPC 支持 macOS,tcmalloc 允许使用捆绑版(仅 Linux)
Enterprise Linux 8/9 使用 GCC 13 构建
Windows 上 MySQL Configurator 现支持自动升级 8.4 LTS
## 弃用与未来移除预告
MIN_VALUE / MAX_VALUE 列(Performance Schema)
混合事务/非事务表更新(见前述弃用警告)
## 七、大量 Bug 修复精选
- InnoDB:修复了 ALTER TABLE 后 UPDATE 挂起、空间索引 SRID 列返回空结果、TempTable 引擎下 GROUP BY 慢一倍等问题
- 复制:修复了 GTID + relay_log_space_limit 导致死锁、生成列 + binlog_row_image=MINIMAL 导致复制失败
- 查询优化:修复了 IN (SELECT ... EXCEPT ...) 错误结果、HAVING 中子查询转派生表时崩溃、ORDER BY + LIMIT 成本估算不准确
- JSON 函数:补充了 NULLIF()、COALESCE()、>> 的错误处理
- 窗口函数/聚合:修复了 SUM(DISTINCT SUBSTRING(...)) 不警告的问题
## 总结
MySQL 9.0.0 是一个具有前瞻性的创新版本,引入了未来的 AI 向量支持(虽然早期限制较多)和企业级的 JavaScript 存储过程能力。同时,它坚决地移除了老旧的 mysql_native_password,并对混合引擎事务等遗留行为发出了弃用信号。
如果你是开发者或架构师,可以:
在非生产环境体验 VECTOR 和 JavaScript MLE
开始规划从 mysql_native_password 迁移到 caching_sha2_password
检查应用中是否有混合 InnoDB/MyISAM 的事务,提前改造
由于 9.0.0 已被撤回,实际使用时建议直接部署 MySQL 9.0.1+。下一个 LTS 版本为 MySQL 8.4 LTS(支持至 2032 年),9.x 系列为短生命周期创新版,不推荐生产长期部署。
## 参考链接
MySQL 9.0.0 完整 Release Notes(内容已撤回,仅存档)
MySQL 9.0.1 发布说明(推荐阅读)
文章最后更新时间:
2026年05月11日 16:01:08