MySQL9.1.0 新特性
---- 以下信息转自 微信公众号“MySQL数据库联盟”
MySQL 创新版9.1.0 于2024年10月15日正式发布。
原子DDL 能力增强
- 当 CREATE DATABASE 在创建数据库目录之后但在实际提交操作之前失败时,数据字典没有数据库存在的记录,但数据库目录仍然存在于文件系统中,因此需要手动清理。
- 当由于文件系统错误或意外关闭而无法成功删除作为 DROP DATABASE 一部分的数据库目录时,包含 DROP DATABASE 的事务并不总是回滚;在这种情况下,需要人工干预来纠正问题。
9.1 版本中,只要受影响的数据库中的所有表都使用支持原子数据定义语句的存储引擎(例如 InnoDB),那么create database,drop database 是完全原子的。
详细的信息请查看 https://dev.mysql.com/doc/refman/9.1/en/atomic-ddl.html
审核日志注释
审计日志将名称不以字母数字字符(如“$foo”)开头的用户视为无效用户,尽管 MySQL 服务器允许创建此类用户。
SQL 函数和运算符说明
当同时使用 DISTINCT 时,在某些情况下,对于相同的值,SUM() 会产生不同的结果。例如:
原因是,在使用 DISTINCT 时,使用临时表来保存值,以便最终仅将唯一值返回给用户。在设置 DISTINCT 时创建此类表时,我们没有考虑数据类型和长度已经确定,而是重新计算它们。现在我们使用已经确定的数据类型和长度。(Bug #115476, Bug #36796197)
SQL语法:
使用如下格式 db_name.tbl_name
标识派生表中的列。尽管这种行为与SQL标准矛盾,但该参照也在表达式中被错误地接受了。现在不允许使用这样的列引用。在此版本中增加了对 IF
NOT EXISTS 子句与CREATE VIEW 语句一起使用的支持。IF NOT EXISTS 的作用如下:
如果语句中指定的视图不存在,视图像往常一样被创建。如果视图已经存在,则语句将显示成功,但不会更改视图定义,并且产生一个警告,如下所示:
IF NOT EXISTS 与 OR REPLACE 不兼容,并且这两个从句不能同时使用 CREATE
VIEW语句。尝试这样做会导致语句将以语法错误被拒绝。
触发器优化
性能:以前,对于具有一个或多个触发器的表,每次访问该表时,都会完全解析触发器并将其加载到内存中。这通常会导致意外的高资源使用率和/或涉及/或复杂触发器且未更改数据的方案中不合理的长执行时间。它还导致只读副本上不必要的资源使用。
我们通过将触发器的解析和加载分为两个独立的阶段来解决这个问题:在第一阶段,我们只读取触发器元数据,因为该元数据可以存储一次并在同一触发器的不同实例之间共享。触发器的实际解析和执行在第二阶段完成,该阶段仅对修改 table 数据的操作执行;这样可以节省资源,因为我们不再解析和缓存在执行 SELECT 语句等时不使用的触发器。
话说 ,目前在 MySQL 中使用触发器的用户还多吗?业务逻辑放到数据库中会带来哪些好处和坏处呢?
向量数据类型
STRING_TO_VECTOR() 函数现在允许在 VECTOR 参数的字符串表示形式中使用尾随空格。解析器现在会修剪数字之后、方括号之前、方括号之后或这些值的任意组合中的空白字符。下面显示了以前不支持但现在允许的值的一些示例:
**
添加或更改的功能
**
EXPLAIN 相关
**
1、为了输出的一致性,当 explain_json_format_version=2 时,在 EXPLAIN FORMAT=JSON lookup_condition 显示的条件中,在 = 符号前后添加了空格,以及使用 EXPLAIN FORMAT=TREE 时为操作显示的空格。
2、EXPLAIN FORMAT=TREE 的输出现在包含有关使用的 semijoin 策略的信息(如果有)。
3、当 explain_json_format_version 设置为 2 时,每当 MRR 用于 MRR 和索引范围扫描访问路径时,向 EXPLAIN FORMAT=JSON 输出添加了 multi_range_read:true。此外,(Multi-Range Read) 现在显示在 EXPLAIN FORMAT=TREE 输出的 operation 字段中,用于使用 MRR 进行索引范围扫描。(错误 #36614948)
4、现在可以在服务器启动时使用 performance-schema-meter 参数从命令行或配置文件启用或禁用遥测仪表。
总体看下来,除了 INSTANT DDL 支持次数的改善,其他值得关注的点不是很多,大家可以查看原文地址,关注更细节的东西,比如bug。