MySQL 8.0中新增的功能(五)

改进哈希连接性能

MySQL 8.0.23重新实现了用于哈希连接的哈希表,从而改进了哈希连接的性能。这项工作包括修复了一个问题(Bug#31516149,Bug#99933),在这个问题中,用于连接缓冲区(join_buffer_size)的分配内存实际上只能使用大约2/3。
新的哈希表通常比旧的更快,并且在对齐、键/值和存在许多相同键的场景中使用更少的内存。此外,当哈希表的大小增加时,服务器现在可以释放旧的内存。

公共表达式

MySQL现在支持通用表达式(Common Table Expressions,CTEs),包括非递归和递归类型。通过允许在SELECT语句和某些其他语句之前使用WITH子句,通用表达式可以使用命名的临时结果集。

通用表达式允许在查询中使用具名临时结果集,这在MySQL 8.0.19及以上版本中开始支持。

对于递归通用表达式(CTE),从MySQL 8.0.19开始,支持在递归SELECT一部分中使用LIMIT子句,还支持LIMIT的OFFSET。

窗口函数

MySQL现在支持窗口函数(window functions),可以针对查询结果中的每一行执行基于相关行的计算。这些函数包括RANK()、LAG()和NTILE()等。此外,现在还可以将一些现有的聚合函数作为窗口函数使用,例如SUM()和AVG()等。

LATERAL衍生表

现在可以在派生表之前加上LATERAL关键字,以指定它可以引用(依赖于)同一个FROM子句中之前表的列。LATERAL衍生表使得一些在非LATERAL派生表中不能实现的SQL操作成为可能,或者需要使用效率较低的解决方法来完成。

在单表DELETE语句中使用别名

在MySQL 8.0.16及更高版本中,单表DELETE语句支持使用表别名。

正则表达式(Regular Expression)支持

先前,MySQL使用Henry Spencer的正则表达式库来支持正则表达式操作符(REGEXP,RLIKE)。正则表达式支持已经重新实现,使用了国际化组件Unicode(ICU),它提供了完整的Unicode支持,并且是多字节安全的。现在,REGEXP和RLIKE操作符是REGEXP_LIKE()函数的同义词,REGEXP_LIKE()函数按照正则表达式匹配的方式进行匹配。此外,还可使用REGEXP_INSTR()、REGEXP_REPLACE()和REGEXP_SUBSTR()函数来查找匹配位置,并进行子串替换和提取。通过regexp_stack_limit和regexp_time_limit系统变量,可以对匹配引擎的资源消耗进行控制。

内部临时表(Internal Temporary Tables)

TempTable存储引擎取代了MEMORY存储引擎,成为默认的内存中内部临时表的存储引擎。TempTable存储引擎提供了对VARCHAR和VARBINARY列的高效存储。internal_tmp_mem_storage_engine会话变量用于定义内存中内部临时表的存储引擎。可接受的值为TempTable(默认值)和MEMORY。temptable_max_ram变量定义了TempTable存储引擎在数据存储到磁盘之前可以使用的最大内存量。

日志

这些增强功能是为了改进日志记录而添加的:

- 错误日志记录被重写为使用MySQL组件架构。传统的错误日志记录使用内置组件来实现,而使用系统日志进行记录的方法则是作为可加载组件来实现的。此外,还提供了可加载的JSON日志编写器。
- 从MySQL 8.0.30开始,在InnoDB存储引擎可用之前可以隐式加载错误日志组件。加载错误日志组件的新方法会加载并启用由log_error_services变量定义的组件。
- 之前,必须首先使用INSTALL COMPONENT命令安装错误日志组件,然后在InnoDB完全可用后才能加载,因为要加载的组件列表是从mysql.components表中读取的,该表是一个InnoDB表。
- 隐式加载错误日志组件具有以下优点:
  - 日志组件在启动过程中较早地加载,使得日志信息更早可用。
  - 在启动过程中发生故障时,有助于避免缓冲日志信息的丢失。
  - 不需要使用INSTALL COMPONENT命令加载日志组件,简化了错误日志配置。
- 为了向后兼容,仍支持使用INSTALL COMPONENT命令显式加载日志组件的方法。

备份锁

一种新型的备份锁允许在在线备份期间进行DML操作,同时防止可能导致不一致快照的操作。这种新的备份锁由LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE语法支持。使用这些语句需要具备BACKUP_ADMIN特权。

复制

MySQL复制功能已经进行了以下增强:
- MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,相比于完整的JSON文档日志记录,这样可以节省日志空间。当使用基于语句的日志记录时,将自动进行紧凑日志记录;并且可以通过将新的binlog_row_value_options系统变量设置为PARTIAL_JSON来启用。

连接管理

MySQL服务器现在允许为管理连接专门配置TCP/IP端口。这提供了一种替代方案,可以在已建立最大连接数的情况下,用于普通连接的网络接口上仍然允许单个管理连接。

MySQL现在提供了更多对压缩使用的控制,以最小化发送到服务器的字节数。以前,一个给定的连接要么是未压缩的,要么使用zlib压缩算法。现在,还可以使用zstd算法,并为zstd连接选择压缩级别。允许配置服务器端的压缩算法,以及源/副本复制或组复制中客户端程序和参与的服务器连接发起方的连接的压缩算法。

猜你喜欢

转载自blog.csdn.net/hay23455/article/details/135452885