MySQL 8.0中新增的功能(六)
配置
MySQL中主机名的最大允许长度已经从之前的60个字符提高到255个ASCII字符。这适用于数据字典中与主机名相关的列、mysql系统模式、性能模式、INFORMATION_SCHEMA和sys模式;CHANGE MASTER TO语句的MASTER_HOST值;SHOW PROCESSLIST语句输出中的Host列;帐户名称中的主机名(例如在帐户管理语句和DEFINER属性中使用的主机名);以及与主机名相关的命令选项和系统变量。
注意事项:
- 允许的主机名长度增加可能会影响对主机名列创建索引的表。例如,现在对主机名进行索引的mysql系统模式中的表必须显式指定ROW_FORMAT属性为DYNAMIC,以容纳更长的索引值。
- 一些基于文件名的配置设置可能是根据服务器主机名构建的。允许的值受基础操作系统的限制,该操作系统可能不允许文件名包含255个字符的主机名长度。这会影响general_log_file、log_error、pid_file、relay_log和slow_query_log_file等系统变量和相应的选项。如果基于主机名的值对于操作系统来说太长,则必须提供显式较短的值。
- 尽管服务器现在支持255个字符的主机名,但使用--ssl-mode=VERIFY_IDENTITY选项建立与服务器的连接受OpenSSL支持的最大主机名长度的限制。主机名匹配涉及SSL证书的两个字段,其最大长度如下:通用名称:最大长度为64;主题备用名称:根据RFC#1034规定的最大长度。
插件
之前,MySQL插件可以用C或C++编写。现在,MySQL插件所使用的头文件包含了C++代码,这意味着插件必须用C++而不是C来编写。
C API
The MySQL C API现在支持用于与MySQL服务器进行非阻塞通信的异步函数。每个函数都是现有同步函数的异步对应函数。如果读取或写入到服务器连接必须等待,同步函数会阻塞线程。而异步函数可以让应用程序检查服务器连接上的工作是否准备好继续进行。如果还没有准备好,应用程序可以在稍后再次检查之前执行其他工作。
在类型转换中的附加目标类型
在MySQL 8.0.17版本中,函数CAST()和CONVERT()现在支持将值转换为DOUBLE、FLOAT和REAL类型。
JSON模式验证
MySQL 8.0.17引入了两个函数JSON_SCHEMA_VALID()和JSON_SCHEMA_VALIDATION_REPORT(),用于根据JSON模式验证JSON文档。
JSON_SCHEMA_VALID()函数用于验证JSON文档是否符合指定的模式,并返回TRUE(1)表示验证通过,返回FALSE(0)表示验证失败。
JSON_SCHEMA_VALIDATION_REPORT()函数返回一个包含有关验证结果的详细信息的JSON文档。
这两个函数具有以下特点:
- 模式必须符合JSON Schema规范的草案4。
- 支持required属性。
- 不支持外部资源和$ref关键字。
- 支持正则表达式模式,无效的模式会被静默忽略。
多值索引
从MySQL 8.0.17开始,InnoDB支持创建多值索引。多值索引是在存储数组值的JSON列上定义的二级索引,对于单个数据记录可以有多个索引记录。这样的索引使用了类似于 ?CAST(data->'$.zipcode' AS UNSIGNED ARRAY)
?的键部分定义。当查询适用于多值索引时,MySQL优化器会自动使用该索引,并且可以在EXPLAIN的输出中查看。
作为这项工作的一部分,MySQL添加了一个新函数JSON_OVERLAPS()和一个新的MEMBER OF()操作符,用于处理JSON文档,并扩展了CAST()函数,增加了一个新的ARRAY关键字,具体描述如下:
- JSON_OVERLAPS()比较两个JSON文档。如果它们包含任何共同的键值对或数组元素,则函数返回TRUE(1),否则返回FALSE(0)。如果两个值都是标量,函数执行简单的相等性测试。如果一个参数是JSON数组而另一个是标量,标量将被视为数组元素。因此,JSON_OVERLAPS()可以作为JSON_CONTAINS()的补充。
- MEMBER OF()测试第一个操作数(标量或JSON文档)是否是作为第二个操作数传递的JSON数组的成员,如果是,则返回TRUE(1),否则返回FALSE(0)。不执行操作数的类型转换。
- CAST(expression AS type ARRAY)允许通过将JSON文档中的JSON数组在json_path处转换为SQL数组来创建一个函数索引。类型说明符仅限于CAST()已支持的类型,BINARY除外(不支持)。CAST()和ARRAY关键字的此用法仅由InnoDB支持,并且仅用于创建多值索引。
可提示的time_zone
在MySQL 8.0.17中,可以使用SET_VAR语法来将time_zone会话变量设置为可提示(hintable)的。
重做日志归档
从MySQL 8.0.17开始,InnoDB引擎支持重做日志归档。在备份操作进行时,备份工具复制重做日志记录可能无法跟上重做日志的生成速度,导致部分重做日志记录被覆盖而丢失。
为了解决这个问题,重做日志归档功能被引入。这个功能会将重做日志记录按顺序写入到一个归档文件中。备份工具可以根据需要从归档文件复制重做日志记录,从而避免数据的潜在丢失。
?克隆插件
As of MySQL 8.0.17, MySQL确实提供了一款克隆插件(clone plugin),允许在本地或远程MySQL服务器实例上进行InnoDB数据的克隆操作。本地克隆操作将克隆的数据存储在运行MySQL实例的同一台服务器上。而远程克隆操作则通过网络从提供数据的MySQL服务器实例传输克隆的数据到接收方服务器或节点。
克隆插件支持复制(replication)。除了克隆数据外,克隆操作还从提供数据的服务器中提取并传输复制坐标(replication coordinates),并应用于接收方服务器,从而使得克隆插件可以用于生成Group Replication成员和副本。使用克隆插件进行生成操作比复制大量事务要快得多且更加高效。同时,Group Replication成员还可以配置为使用克隆插件作为恢复的替代方法,从而使成员可以自动选择最高效的方式从种子成员中检索群组数据。
从MySQL 8.0.27开始,允许在进行克隆操作时,在提供数据的MySQL服务器实例上进行并发的DDL操作。之前,在克隆操作期间会持有备份锁,阻止在提供数据的服务器上进行并发的DDL操作。如果要恢复到在克隆操作期间阻止并发DDL操作的先前行为,请启用 ?clone_block_ddl
?变量。
从MySQL 8.0.29开始,?clone_delay_after_data_drop
?变量允许在远程克隆操作开始时,在接收方MySQL服务器实例上删除现有数据之后指定延迟时间。该延迟旨在为接收方主机上的文件系统在从提供数据的MySQL服务器实例克隆数据之前释放足够的空间提供足够的时间。某些文件系统会异步地在后台进程中释放空间。对于这些文件系统,在删除现有数据后过早地克隆数据可能导致克隆操作失败,因为空间不足。最大延迟时间为3600秒(1小时)。默认设置为0(无延迟)。
哈希连接优化(Hash Join Optimization)
从MySQL 8.0.18开始,只要加入操作中每对表至少包含一个等值连接条件,并且没有索引适用于任何连接条件,则使用哈希连接。哈希连接不需要索引,尽管它可以与仅适用于单表谓词的索引一起使用。在大多数情况下,哈希连接比块嵌套循环算法更高效。可以通过以下方式对类似于下面显示的连接进行优化:
SELECT *
FROM t1
JOIN t2
ON t1.c1=t2.c1;
SELECT *
FROM t1
JOIN t2
ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2)
JOIN t3
ON (t2.c1 = t3.c1)
哈希连接还可以用于笛卡尔积操作,即当没有指定连接条件时。您可以使用EXPLAIN FORMAT=TREE或EXPLAIN ANALYZE查看特定查询中是否使用了哈希连接优化。(在MySQL 8.0.20及更高版本中,您还可以使用EXPLAIN,省略FORMAT=TREE。)
哈希连接可用的内存量受到join_buffer_size值的限制。如果哈希连接所需的内存超过该值,则会在磁盘上执行;一个磁盘上的哈希连接可以使用的磁盘文件数量受到open_files_limit的限制。
截至MySQL 8.0.19,不再支持在MySQL 8.0.18中引入的hash_join优化器开关(虽然hash_join = on仍然出现在optimizer_switch的值中,但设置它不再产生任何效果)。HASH_JOIN和NO_HASH_JOIN优化器提示也不再被支持。这两个开关和提示现在都已被弃用,预计它们将在未来的MySQL版本中被移除。在MySQL 8.0.18及更高版本中,可以使用NO_BNL优化器开关禁用哈希连接。
从MySQL 8.0.20开始,MySQL服务器不再使用块嵌套循环,而是在以前可能使用块嵌套循环的任何情况下都使用哈希连接,即使查询中不包含等值连接条件。这适用于内部非等值连接、半连接(semijoins)、反连接(antijoins)、左外连接和右外连接。optimizer_switch系统变量的block_nested_loop标志以及BNL和NO_BNL优化器提示仍然受支持,但从现在开始只能控制哈希连接的使用。此外,内部和外部连接(包括半连接和反连接)现在都可以使用批量键访问(BKA),它逐步分配连接缓冲区内存,因此单个查询不需要使用大量实际上并不需要的资源进行解析。从MySQL 8.0.18开始,仅支持内部连接使用BKA。
在MySQL 8.0.20中,还使用迭代器执行器取代了以前版本的MySQL中使用的执行器。这项工作包括替换旧的索引子查询引擎,该引擎控制形式为WHERE value IN(SELECT column FROM table WHERE ...)的查询,对于那些没有被优化为半连接的IN查询,以及以相同形式物化的查询,以前依赖于旧的执行器。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!