MySQL 8.0 中的新增功能(正式发布)

灰暗的星星灰暗的星星灰暗的星星灰暗的星星灰暗的星星
 

我们自豪地宣布 MySQL 8.0 正式发布。立即下载!MySQL 8.0 是世界上最受欢迎的开源数据库的一个非常令人兴奋的新版本,并进行了全面的改进。一些主要增强功能包括:

  1. SQL 窗口函数、公共表表达式、NOWAIT 和 SKIP LOCKED、降序索引、分组、正则表达式、字符集、成本模型和直方图。
  2. JSON 格式扩展了语法、新功能、改进的排序和部分更新。借助 JSON 表函数,您可以将 SQL 机制用于 JSON 数据。
  3. 地理信息系统 地理支持。空间参考系统 (SRS) 以及 SRS 感知空间数据类型、空间索引和空间函数。
  4. 可靠性 DDL 语句已经变得原子化和崩溃安全,元数据存储在单个事务性数据字典中。由 InnoDB 提供支持!
  5. 可观察性对 Performance Schema、Information Schema、Configuration Variables 和 Error Logging 进行了重大增强。
  6. 可管理性远程管理、撤消表空间管理和新的即时 DDL。
  7. 安全 OpenSSL 改进、新的默认身份验证、SQL 角色、打破超级权限、密码强度等。
  8. 性能InnoDB 在读/写工作负载、IO 绑定工作负载和高争用“热点”工作负载方面明显更好。添加了资源组功能,通过将用户线程映射到 CPU,为用户提供针对特定硬件上的特定工作负载进行优化的选项。

以上内容代表了其中的一些亮点,我鼓励您进一步深入研究完整的 Milestone 博客文章系列(8.0.0、8.0.1、8.0.2、8.0.3 和 8.0.4),甚至进一步深入研究各个工作日志及其规范和实施细节。或者,您可能更喜欢只查看 github.com/mysql 的源代码。

开发人员功能

MySQL 开发人员需要新功能,而 MySQL 8.0 在 SQL、JSON、正则表达式和 GIS 等领域提供了许多新的和呼声很高的功能。开发人员还希望能够存储 Emojis,因此 UTF8MB4 现在是 8.0 中的默认字符集。最后,数据类型也有所改进,对 BINARY 数据类型进行了按位运算,并改进了 IPv6 和 UUID 函数。

SQL

窗口函数

MySQL 8.0 提供 SQL 窗口功能。与分组聚合函数类似,窗口函数对一组行执行一些计算,例如 COUNT 或 SUM。但是,如果分组聚合将此行集折叠为一行,则窗口函数将对结果集中的每一行执行聚合。

窗口函数有两种类型:用作窗口函数的 SQL 聚合函数和专用窗口函数。这是 MySQL 中支持窗口的聚合函数集:COUNT、SUMAVGMINMAXBIT_ORBIT_ANDBIT_XORSTDDEV_POP(及其同义词 STDSTDDEV)、STDDEV_SAMPVAR_POP(及其同义词 VARIANCE)和 VAR_SAMP。专用窗口函数集包括:RANK、DENSE_RANKPERCENT_RANKCUME_DISTNTILE、ROW_NUMBERFIRST_VALUELAST_VALUENTH_VALUELEAD 和 LAG

对窗口函数(又名分析函数)的支持是用户的常见请求。窗口函数长期以来一直是标准 SQL (SQL 2003) 的一部分。在此处查看 Dag Wanvik 的博客文章,以及 Guilhem Bichot 的博客文章。

公共表表达式

MySQL 8.0 提供 [递归] 公用表表达式 (CTE)。非递归 CTE 可以解释为“改进的派生表”,因为它允许多次引用派生表。递归 CTE 是一组迭代构建的行:从初始行集开始,进程派生新行,这些行会增加集合,这些新行将再次馈送到进程中,生成更多行,依此类推,直到进程不再生成行。CTE 是经常请求的 SQL 功能,例如,请参阅功能请求 16244 和 32174 。请在此处、此处、此处和此处查看 Guilhem Bichot 的博客文章。

NOWAIT 和 SKIP 锁定

MySQL 8.0 在 SQL 锁定子句中提供和替代方案。通常,当行由于 an 或 a 而被锁定时,任何其他事务都必须等待访问该锁定的行。在某些用例中,如果行被锁定,则需要立即返回或忽略锁定的行。using 的锁定子句永远不会等待获取行锁。相反,查询将失败并显示错误。使用 的锁定子句永远不会等待获取列出的 table 上的行锁。相反,将跳过锁定的行,并且根本不读取。NOWAIT 和 SKIP LOCKED 是经常请求的 SQL 功能。有关示例,请参阅 feature request 49763 。我们还想感谢 Kyle Oppenheim 对代码的贡献!在此处查看 Martin Hansson 的博客文章。NOWAITSKIP LOCKEDUPDATESELECT ... FOR UPDATENOWAITSKIP LOCKED

降序索引

MySQL 8.0 支持按降序排列的索引。此类索引中的值按降序排列,我们向前扫描它。在 8.0 之前,当用户创建降序索引时,我们会创建一个升序索引并对其进行反向扫描。一个好处是前向索引扫描比后向索引扫描更快。真正的降序索引的另一个好处是,它使我们能够对具有混合排序键部分的子句使用 indexes 而不是 filesort。降序索引是一项经常请求的 SQL 功能。有关示例,请参阅 feature request 13375 。在此处查看 Chaithra Gopalareddy 的博客文章。ORDER BYASC/DESC

分组

MySQL 8.0 提供 、 、 .该函数将超级聚合行与常规分组行区分开来。 扩展(如)会生成超级聚合行,其中所有值的集合都由 null 表示。使用该函数,您可以区分表示超级聚合行中所有值集的 null 与常规行中的 a。GROUPING 是一项经常请求的 SQL 功能。请参阅功能请求 3156 和 46053。感谢 Zoe Dong 和 Shane Adams 在功能请求 46053 中贡献的代码!在此处查看 Chaithra Gopalareddy 的博客文章。GROUPING()SQL_FEATURE T433GROUPING()GROUP BYROLLUPGROUPING()NULL

优化器提示

在 5.7 中,我们为优化器提示引入了新的提示语法。使用新语法,可以在 SQL 语句中的关键字后面直接指定提示,并将其括在样式注释中。(请在此处查看 Sergey Glukhov 的 5.7 博客文章)。在 MySQL 8.0 中,我们通过充分利用这种新样式来完成这幅画:SELECT | INSERT | REPLACE | UPDATE | DELETE/*+ */

  • MySQL 8.0 为 和 添加了提示。这允许用户控制单个查询的索引合并行为,而无需更改优化器开关。INDEX_MERGENO_INDEX_MERGE
  • MySQL 8.0 添加了 、 、 和 的提示。这允许用户控制联接执行的 table 顺序。JOIN_FIXED_ORDERJOIN_ORDERJOIN_PREFIXJOIN_SUFFIX
  • MySQL 8.0 添加了一个名为 .该提示将仅为 next 语句设置给定系统变量的值。因此,在语句结束后,该值将重置为前一个值。在此处查看 Sergey Glukhov 的博客文章。SET_VARSET_VAR

我们更喜欢新样式的优化器提示,而不是旧样式的提示和optimizer_switch值设置。由于不与 SQL 混合,新提示可以注入查询字符串中的许多位置。它们在作为提示 (vs directive) 方面也有更清晰的语义。

JSON 格式

MySQL 8.0 添加了新的 JSON 函数,并提高了对 JSON 值进行排序和分组的性能。

JSON 路径表达式中范围的扩展语法

MySQL 8.0 扩展了 JSON 路径表达式中范围的语法。例如,结果为 。引入的新语法是 SQL 标准语法的子集,如 SQL:2016, 9.39 SQL/JSON 路径语言:语法和语义中所述。另请参阅 Roland Bouman 报告的 Bug#79052。SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1 to 3]');[2, 3, 4]

JSON 表函数

MySQL 8.0 添加了 JSON 表函数,支持对 JSON 数据使用 SQL 机制。 创建 JSON 数据的关系视图。它将 JSON 数据评估的结果映射到关系行和列。用户可以使用 SQL 将函数返回的结果作为常规关系表进行查询,例如 join、project 和 aggregate。JSON_TABLE()

JSON 聚合函数

MySQL 8.0 添加了聚合函数以生成 JSON 数组和生成 JSON 对象。这样就可以将多行中的 JSON 文档合并到 JSON 数组或 JSON 对象中。在此处查看 Catalin Besleaga 的博客文章。JSON_ARRAYAGG()JSON_OBJECTAGG()

JSON 合并函数

该函数实现了 RFC7396 指定的 JavaScript(和其他脚本语言)的语义,即它按第二个文档的优先级删除重复项。例如。JSON_MERGE_PATCH()JSON_MERGE('{"a":1,"b":2 }','{"a":3,"c":4 }'); # returns {"a":3,"b":2,"c":4}

该函数具有在 MySQL 5.7 中实现的 JSON_MERGE() 语义,它保留所有值,例如JSON_MERGE_PRESERVE()JSON_MERGE('{"a": 1,"b":2}','{"a":3,"c":4}'); # returns {"a":[1,3],"b":2,"c":4}.

现有函数在 MySQL 8.0 中已弃用,以消除合并操作的歧义。另请参阅 Bug#81283 中的提案和 Morgan Tocker 的博客文章。JSON_MERGE()

JSON Pretty 函数

MySQL 8.0 在 MySQL 中增加了一个函数。该函数接受 JSON 的 JSON 原生数据类型或 JSON 的字符串表示形式,并以人类可读的方式返回带有新行和缩进的 JSON 格式字符串。JSON_PRETTY()

JSON 大小函数

MySQL 8.0 添加了与给定 JSON 对象的空间使用相关的 JSON 函数。这将返回 JSON 数据类型的实际大小(以字节为单位)。这将返回 JSON 二进制类型的可用空间(以字节为单位),包括为就地更新而保存的碎片和填充。JSON_STORAGE_SIZE()JSON_STORAGE_FREE()

JSON 改进的排序

MySQL 8.0 通过使用可变长度排序键为对 JSON 值进行排序/分组提供了更好的性能。初步基准显示,根据用例,排序性能提高了 1.2 到 18 倍。

JSON 部分更新

MySQL 8.0 增加了对 和 函数的部分更新的支持。如果只更新了 JSON 文档的某些部分,我们希望向处理程序提供有关更改内容的信息,以便存储引擎和复制不需要编写完整文档。在复制环境中,无法保证 JSON 文档的布局在从服务器和主服务器上完全相同,因此物理差异不能用于减少基于行的复制的网络 I/O。因此,MySQL 8.0 提供了基于行的复制可以通过网络发送并在从属服务器上重新应用的逻辑差异。在此处查看 Knut Anders Hatlen 的博客文章。JSON_REMOVE()JSON_SET()JSON_REPLACE()

地理信息系统

MySQL 8.0 提供地理支持。这包括对空间参考系统 (SRS) 的元数据支持,以及 SRS 感知空间数据类型、空间索引和空间函数。简而言之,MySQL 8.0 可以理解地球表面的纬度和经度坐标,例如,在大约 5000 个受支持的空间参考系统中,可以正确计算地球表面上两点之间的距离。

空间参考系 (SRS)

信息架构视图提供有关空间数据的可用空间参考系统的信息。此视图基于 SQL/MM (ISO/IEC 13249-3) 标准。每个空间参考系统都由一个 SRID 编号标识。MySQL 8.0 附带了来自 EPSG 大地测量参数数据集的大约 5000 个 SRID,涵盖地理配准椭球体和 2D 投影(即所有 2D 空间参考系统)。ST_SPATIAL_REFERENCE_SYSTEMS

SRID 感知空间数据类型

空间数据类型可以使用空间参考系统定义进行属性化,例如使用 SRID 4326,如下所示:SRID 在此处是 GEOMETRY 数据类型的 SQL 类型修饰符。插入到具有 SRID 属性的列中的值必须位于该 SRID 中。尝试使用其他 SRID 插入值会导致引发异常情况。未修改的类型(即没有 SRID 规范的类型)将继续像以前一样接受所有 SRID。CREATE TABLE t1 (g GEOMETRY SRID 4326);

MySQL 8.0 添加了 SQL/MM 第 3 部分 第 19.2 节中指定的视图。此视图将列出 MySQL 实例中的所有 GEOMETRY 列,并且对于每个列,它将列出标准 、 和 。INFORMATION_SCHEMA.ST_GEOMETRY_COLUMNSSRS_NAMESRS_IDGEOMETRY_TYPE_NAME

SRID 感知空间索引

可以根据空间数据类型创建空间索引。空间索引中的列必须声明为 NOT NULL。例如,如下所示:CREATE TABLE t1 (g GEOMETRY SRID 4326 NOT NULL, SPATIAL INDEX(g));

具有空间索引的列应具有 SRID 类型修饰符,以允许优化器使用该索引。如果在没有 SRID 类型修饰符的列上创建空间索引,则会发出警告。

SRID 感知空间函数

MySQL 8.0 扩展了空间函数,例如 和 检测其参数是否位于地理(椭球体)SRS 中,并计算椭球体上的距离。到目前为止,空间关系(如 、 、 等)支持地理计算。每个 ST 函数的行为如 SQL/MM 第 3 部分 空间 中所定义。ST_Distance()ST_Length()ST_DistanceST_WithinST_IntersectsST_ContainsST_Crosses

字符集

MySQL 8.0 将 UTF8MB4 作为默认字符集。与 5.7 相比,8.0 中的 SQL 性能(例如对字符串UTF8MB4排序)提高了 20 倍。UTF8MB4 是 Web 的主要字符编码,此举将使绝大多数 MySQL 用户的生活更轻松。

  • 默认字符集已从 更改为 ,默认排序规则已从 更改为 。latin1utf8mb4latin1_swedish_ciutf8mb4_800_ci_ai
  • defaults 中的更改适用于 libmysql 和服务器命令工具以及服务器本身。
  • 这些更改也会反映在 MTR 测试中,使用新的默认字符集运行。
  • 排序规则权重和大小写映射基于 Unicode 9.0.0 ,由 Unicode 委员会于 2016 年 6 月 21 日宣布。
  • 已为排序规则实施了 21 个可用于 latin1(MySQL 旧版)的特定语言不区分大小写的排序规则,例如,捷克语排序规则变为 utf8mb4_cs_800_ai_ci。请参阅 WL#9108 中的完整列表。在此处查看 Xing Zhang 的博客文章。utf8mb4
  • 添加了对区分大小写和重音排序规则的支持。MySQL 8.0 支持 DUCET(默认 Unicode 排序规则条目表)定义的所有 3 个排序规则权重级别。在此处查看 Xing Zhang 的博客文章。
  • 使用三个级别的权重对字符进行排序的日语排序规则。这将为日语提供正确的排序顺序。在此处查看 Xing Zhang 的博客文章。utf8mb4_ja_0900_as_csutf8mb4
  • 具有额外假名敏感功能的日语,其中“ks”代表“敏感假名”。在此处查看 Xing Zhang 的博客文章。utf8mb4_ja_0900_as_cs_ks
  • 从 Unicode 9.0.0 开始,将所有新的排序规则更改为 be 而不是 ,即像任何其他字符一样处理字符串末尾的空格。这样做是为了提高一致性和性能。较旧的排序规则将保留在原位。NO PADPAD STRING

另请参阅 Bernt Marius Johnsen 的博客文章 这里, 这里 和 这里.

数据类型

对二进制数据类型进行按位运算

MySQL 8.0 扩展了按位运算(“按位 AND”等)以也适用于 .在 8.0 之前,仅整数支持按位运算。如果对二进制文件使用按位运算,则参数在运算之前被隐式转换为 (64 bit),因此可能会丢失位。从 8.0 开始,按位运算适用于所有数据类型和数据类型,强制转换参数以使位不会丢失。[VAR]BINARY/[TINY|MEDIUM|LONG]BLOBBIGINTBINARYBLOB

IPV6 操纵

MySQL 8.0 通过支持对 BINARY 数据类型进行按位运算,提高了 IPv6 操作的可用性。在 MySQL 5.6 中,我们引入了 and 函数,这些函数可以在文本形式之间转换 IPv6 地址,例如 和 。但是,到目前为止,我们还无法将这些 IPv6 函数与按位运算相结合,因为此类运算会错误地将输出转换为 。例如,如果我们有一个 IPv6 地址,并且想要根据网络掩码对其进行测试,我们现在可以使用 because 正确返回数据类型(128 位)。在此处查看 Catalin Besleaga 的博客文章。INET6_ATON()INET6_NTOA()'fe80::226:b9ff:fe77:eb17'VARBINARY(16)BIGINTINET6_ATON(address)
& INET6_ATON(network)
INET6_ATON()VARBINARY(16)

UUID 操作

MySQL 8.0 通过实施三个新的 SQL 函数来提高 UUID 操作的可用性:、 和 。第一个选项从 UUID 格式的文本转换为 ,第二个选项从 UUID 格式的文本转换为,最后一个选项检查 UUID 格式文本的有效性。存储为 a 的 UUID 可以使用函数索引进行索引。函数 和 还可以随机排列与时间相关的位,并在开始时移动它们,使其对索引友好并避免 B 树中的随机插入,从而减少插入时间。缺乏此类功能被认为是使用 UUID 的缺点之一。在此处查看 Catalin Besleaga 的博客文章。UUID_TO_BIN()BIN_TO_UUID()IS_UUID()VARBINARY(16)VARBINARY(16)VARBINARY(16)UUID_TO_BIN()UUID_TO_BIN()

成本模型

Query Optimizer 考虑数据缓冲

MySQL 8.0 根据有关数据是驻留在内存中还是磁盘上的知识来选择查询计划。这是自动发生的,从最终用户的角度来看,不涉及任何配置。从历史上看,MySQL 成本模型假定数据驻留在旋转磁盘上。与在内存中和磁盘上查找数据相关的成本常数现在不同,因此,优化器将根据对数据位置的了解,为这两种情况选择更优化的访问方法。在此处查看 Øystein Grøvlen 的博客文章。

优化器直方图

MySQL 8.0 实现了直方图统计。使用直方图,用户可以创建表中列的数据分布统计信息,通常为未索引的列创建统计信息,然后查询优化器将使用这些数据来查找最佳查询计划。直方图统计信息的主要用例是计算“COLUMN operator CONSTANT”形式的谓词的选择性(筛选效果)。

用户通过语法创建直方图,该语法已扩展为接受两个新子句:和 .存储桶的数量是可选的,默认值为 100。直方图统计信息存储在字典表 “column_statistics” 中,可通过视图 .由于 JSON 数据类型的灵活性,直方图存储为 JSON 对象。 将根据表大小自动决定是否对基表进行采样。它还将根据数据分布和指定的存储桶数量来决定是构建单例直方图还是等高直方图。在此处查看 Erik Frøseth 的博客文章。ANALYZE TABLEUPDATE HISTOGRAM ON column [, column] [WITH n BUCKETS]DROP HISTOGRAM ON column [, column]information_schema.COLUMN_STATISTICSANALYZE TABLE


正则表达式

MySQL 8.0 支持 UTF8MB4 的正则表达式以及 、、 和 等新函数。添加了系统变量 regexp_stack_limit(默认字节)和 regexp_time_limit(默认 32 步)来控制执行。该函数是 MySQL 社区最需要的功能之一,例如,请参阅 Hans Ginzel 报告为 BUG #27389 的功能请求。另请参阅 Martin Hansson 的博客文章 此处 和 Bernt Marius Johnsen 的博客文章 此处.REGEXP_INSTR()REGEXP_LIKE()REGEXP_REPLACE()REGEXP_SUBSTR()8000000REGEXP_REPLACE()

Dev Ops 功能

Dev Ops 关心数据库的运营方面,通常涉及可靠性、可用性、性能、安全性、可观察性和可管理性。高可用性附带 MySQL InnoDB Cluster 和 MySQL Group Replication,这将在单独的博客文章中介绍。以下是 8.0 在其他类别中带来的内容。

可靠性

MySQL 8.0 提高了 MySQL 的整体可靠性,因为:

  1. MySQL 8.0 将其元数据存储到 InnoDB 中,InnoDB 是一个经过验证的事务存储引擎。系统表(如用户和权限)以及数据字典表现在驻留在 InnoDB 中。
  2. MySQL 8.0 消除了一个潜在的不一致来源。在 5.7 及更早版本中,基本上有两个数据字典,一个用于 Server 层,一个用于 InnoDB 层,在某些崩溃情况下,它们可能会不同步。在 8.0 中,只有一个数据字典。
  3. MySQL 8.0 确保原子、崩溃安全的 DDL。这样,用户可以保证任何 DDL 语句要么被完全执行,要么根本不执行。这在复制环境中尤为重要,否则可能会出现主服务器和从服务器(节点)不同步的情况,从而导致数据漂移。

这项工作是在新的事务性数据字典的上下文中完成的。请在此处和此处查看 Staale Deraas 的博客文章。

可观察性

信息架构(加速)

MySQL 8.0 重新实现了 Information Schema。在新实现中,信息模式表是存储在 InnoDB 中的数据字典表的简单视图。这比旧的实现效率更高,速度提高了 100 倍。这使得 Information Schema 实际上可以由外部工具使用。在此处查看 Gopal Shankar 的博客文章,以及 Ståle Deraas 的博客文章。

性能架构(加速)

MySQL 8.0 通过在性能 Schema 表上添加 100 多个索引来加速性能 Schema 查询。性能架构表上的索引是预定义的。它们不能被删除、添加或更改。性能模式索引实现为对现有表数据的过滤扫描,而不是通过单独的数据结构进行遍历。无需构建、更新或以其他方式管理 B 树或哈希表。性能模式表索引的行为类似于哈希索引,因为 a) 它们快速检索所需的行,并且 b) 不提供行排序,让服务器在必要时对结果集进行排序。但是,根据查询的不同,索引消除了对全表扫描的需要,并且将返回一个相当小的结果集。性能架构索引在引用索引列的查询的输出中可见并表示。参见 Simon Mudd 的评论。在此处查看 Marc Alff 的博客文章。SHOW INDEXESEXPLAIN

配置变量

MySQL 8.0 添加了有关配置变量的有用信息,例如变量名称、最小/最大值、当前值的来源、更改以及更改时间。此信息位于名为 的新性能架构表中。在此处查看 Satish Bharathy 的博客文章。variables_info

客户端错误报告 – 消息计数

MySQL 8.0 可以查看服务器报告的客户端错误消息的聚合计数。用户可以查看 5 个不同表中的统计信息:全局计数、每个线程的摘要、每个用户的摘要、每个主机的摘要或每个帐户的摘要。对于每条错误消息,用户可以看到引发的错误数、SQL 异常处理程序处理的错误数、“first seen” 时间戳和 “last seen” 时间戳。如果具有正确的权限,用户可以从这些表中重置统计信息。在此处查看 Mayank Prasad 的博客文章。SELECTTRUNCATE

语句延迟直方图

MySQL 8.0 提供语句延迟的性能架构直方图,以便更好地了解查询响应时间。这项工作还从收集的直方图中计算 “P95 ”、“ P99 ” 和 “P999 ”百分位数。这些百分位数可用作服务质量的指标。在此处查看 Frédéric Descamps 的博客文章。

数据锁定依赖关系图

MySQL 8.0 在性能架构中检测数据锁。当事务 A 正在锁定行 R,而事务 B 正在等待同一行时,B 实际上被 A 阻止。添加的检测会公开哪些数据被锁定 (R)、谁拥有锁 (A) 以及谁正在等待数据 (B)。在此处查看 Frédéric Descamps 的博客文章。

摘要查询示例

MySQL 8.0 对 events_statements_summary_by_digest 性能架构表进行了一些更改,以捕获完整的示例查询和有关此查询示例的一些关键信息。添加该列是为了捕获查询样本,以便用户可以在实际查询上运行 EXPLAIN 并获取查询计划。添加该列以捕获查询示例时间戳。添加该列以捕获查询示例执行时间。列 和 已修改为使用秒的小数部分。在此处查看 Frédéric Descamps 的博客文章。QUERY_SAMPLE_TEXTQUERY_SAMPLE_SEENQUERY_SAMPLE_TIMER_WAITFIRST_SEENLAST_SEEN

关于 Instruments 的元数据

MySQL 8.0 将属性易变性和文档等元数据添加到性能架构表setup_instruments。此只读元数据充当仪器的在线文档,供用户或工具查看。在此处查看 Frédéric Descamps 的博客文章。

错误日志记录

MySQL 8.0 对 MySQL 错误日志进行了重大改革。从软件架构的角度来看,错误日志是新服务基础设施中的一个组件。这意味着高级用户可以根据需要编写自己的错误日志实现。大多数用户不想编写自己的错误日志实现,但仍希望在写入内容和写入位置方面具有一定的灵活性。因此,8.0 为用户提供了添加 sink (where) 和过滤器 (what) 的工具。MySQL 8.0 实现了过滤服务 (API) 和默认过滤服务实现(组件)。此处的过滤是指禁止显示给定日志消息中的某些日志消息(选择)和/或字段(投影)。MySQL 8.0 实现了日志编写器服务 (API) 和默认日志编写器服务实现(组件)。日志编写器接受日志事件并将其写入日志。此日志可以是经典文件、syslog、EventLog 和新的 JSON 日志编写器。

默认情况下,无需任何配置,MySQL 8.0 即可提供许多开箱即用的错误日志改进,例如:

  • 错误编号:格式是 10000 系列中前面带有 “MY-” 的数字,例如 “MY-10001”。错误编号在 GA 版本中将是稳定的,但相应的错误文本允许在维护版本中更改(即改进)。
  • 系统消息: 系统消息将作为 [System] 而不是 [Error]、[Warning]、[Note] 写入错误日志。无论详细程度如何,都会打印 [System] 和 [Error] 消息,并且无法抑制。[System] 消息仅在少数地方使用,主要与启动或停止服务器等主要状态转换相关联。
  • 减少详细程度: 默认值 log_error_verbosity 从 3 (Notes) 更改为 2 (Warning)。这使得 MySQL 8.0 错误日志默认不那么详细。
  • 源组件:每条消息都使用三个值 [Server], [InnoDB], [Replic] 之一进行注释,显示消息来自哪个子系统。

这是启动后写入 8.0 GA 错误日志的内容:

在错误日志中引入错误编号允许 MySQL 在保持错误号 (ID) 不变的情况下改进即将发布的维护版本(如果需要)中的错误文本。错误号还充当过滤/抑制和国际化/本地化的基础。

可管理性

INVISIBLE 索引

MySQL 8.0 增加了切换索引可见性(可见/不可见)的功能。优化器在制定查询执行计划时不会考虑不可见索引。但是,索引仍然在后台维护,因此使其再次可见的成本较低。这样做的目的是让 DBA/DevOp 确定是否可以删除索引。如果您怀疑某个索引未被使用,请先将其设为不可见,然后监控查询性能,最后在未遇到查询速度减慢时删除该索引。许多用户都要求使用此功能,例如通过 Bug#70299。在此处查看 Martin Hansson 的博客文章。

灵活的 Undo Tablespace Management

MySQL 8.0 使用户可以完全控制撤消表空间,即表空间的数量、它们的放置位置以及每个表中的回滚段数量

  1. System 表空间中不再有 Undo log。在升级期间,撤消日志将从系统表空间迁移到撤消表空间。这为使用系统表空间进行撤消日志的现有 5.7 安装提供了升级路径。
  2. Undo 表空间可以与 System 表空间分开管理。例如,Undo tablespaces 可以放在快速存储中。
  3. 回收异常大额交易占用的空间(在线)。至少创建两个 Undo 表空间以允许表空间截断。这允许 InnoDB 缩小撤消表空间,因为一个 Undo 表空间可以处于活动状态,而另一个 Undo 表空间被截断。
  4. 回滚 Segment 越多,争用就越少。 用户可以选择最多有 127 个 Undo 表空间,每个表空间最多有 128 个回滚段。更多的回滚段意味着并发事务更有可能对其撤消日志使用单独的回滚段,从而减少对相同资源的争用。

在此处查看 Kevin Lewis 的博客文章。

全局变量的 SET PERSIST

MySQL 8.0 可以持久保存全局动态服务器变量。许多服务器变量既是 GLOBAL 又是 DYNAMIC,并且可以在服务器运行时重新配置。例如:但是,此类设置在服务器重新启动时会丢失。SET GLOBAL sql_mode='STRICT_TRANS_TABLES';

这项工作使编写效果成为可能,该设置将在服务器重启后继续存在。此功能有许多使用场景,但最重要的是,它提供了一种在编辑配置文件不方便或不可用时管理服务器设置的方法。例如,在某些托管环境中,您没有文件系统访问权限,您所拥有的只是连接到一个或多个服务器的能力。至于你需要 的 super 权限。SET PERSIST sql_mode='STRICT_TRANS_TABLES'; SET GLOBALSET PERSIST

还有命令。该命令的语义是从 persist 配置中删除配置变量,从而将其转换为具有与 .RESET PERSISTRESET PERSISTSET GLOBAL

MySQL 8.0 也允许设置大多数只读变量,新值将在下次服务器重启时生效。请注意,一小部分只读变量是有意保留的,不允许设置。在此处查看 Satish Bharathy 的博客文章。SET PERSIST

远程管理

MySQL 8.0 实现了 SQL RESTART 命令。目的是通过 SQL 连接实现对 MySQL 服务器的远程管理,例如,通过后跟 .请参阅博客文章 MySQL 8.0:轻松更改配置且云友好!作者:Frédéric Descamps。SET PERSISTRESTART

重命名表空间 (SQL DDL)

MySQL 8.0 实现了共享/通用表空间是一个用户可见的实体,用户可以 CREATE、ALTER 和 DROP 该实体。另请参见 Bug#26949、Bug#32497 和 Bug#58006。ALTER TABLESPACE s1 RENAME TO s2;

重命名列 (SQL DDL)

MySQL 8.0 实现了这是对现有语法 ALTER TABLE <table_name> CHANGE ...这需要重新指定列的所有属性。旧/现有语法的缺点是,尝试执行重命名的应用程序可能无法获得所有列信息。旧/现有语法中还存在意外更改数据类型的风险,这可能会导致数据丢失。ALTER TABLE ... RENAME COLUMN old_name TO new_name;

安全功能

新的默认身份验证插件

MySQL 8.0 将默认身份验证插件从 mysql_native_password 更改为 caching_sha2_password。相应地,libmysqlclient 也将使用 caching_sha2_password 作为默认身份验证机制。新caching_sha2_password结合了更好的安全性(SHA2 算法)和高性能(缓存)。总体方向是我们建议所有用户使用 TLS/SSL 进行所有网络通信。在此处查看 Harin Vadodaria 的博客文章。

Community Edition
中默认使用 OpenSSL

MySQL 8.0 在 OpenSSL 上统一为 MySQL 企业版和 MySQL 社区版的默认 TLS/SSL 库。以前,MySQL 社区版使用 YaSSL。在 MySQL 社区版中支持 OpenSSL 一直是最常请求的功能之一。在此处查看 Frédéric Descamps 的博客文章。

OpenSSL 是动态链接的

MySQL 8.0 与 OpenSSL 动态链接。从 MySQL 存储库用户的角度来看,MySQL 软件包依赖于手头的 Linux 系统提供的 OpenSSL 文件。通过动态链接,OpenSSL 更新可以在可用时应用,而无需 MySQL 升级或修补。在此处查看 Frédéric Descamps 的博客文章。

撤消和重做日志的加密

MySQL 8.0 实现了 UNDO 和 REDO 日志的静态数据加密。在 5.7 中,我们为存储在逐表文件表空间中的 InnoDB 表引入了表空间加密。此功能为物理表空间数据文件提供静态加密。在 8.0 中,我们将其扩展为包括 UNDO 和 REDO 日志。请参阅此处的文档。

SQL 角色

MySQL 8.0 实现了 SQL 角色。角色是权限的命名集合。目的是简化用户访问权限管理。用户可以向用户授予角色、向角色授予权限、创建角色、删除角色以及决定在会话期间适用哪些角色。在此处查看 Frédéric Descamps 的博客文章。

允许 PUBLIC 的授权和撤销

MySQL 8.0 引入了配置变量 mandatory-roles,可用于在创建新用户时自动分配和授予默认角色。例:。所有指定的角色始终被视为已授予每个用户,并且无法撤销。这些角色仍需要激活,除非它们被设为默认角色。当新的服务器配置变量 activate-all-roles-on-login 设置为 “ON” 时,所有授予的角色始终在用户通过身份验证后激活。role1@%,role2,role3,role4@localhost

打破 super 权限

MySQL 8.0 为以前版本中 SUPER 的各个方面定义了一组新的精细权限。目的是将用户访问权限限制为手头作业所需的权限,仅此而已。例如 BINLOG_ADMIN、CONNECTION_ADMIN 和 ROLE_ADMIN。

 

用于管理 XA 事务的授权模型

MySQL 8.0引入了一个新的 system 权限,该权限控制执行 statement 的能力。未被授予新系统权限的用户尝试执行此操作将导致错误。XA_RECOVER_ADMINXA RECOVERXA RECOVERXA_RECOVER_ADMIN

密码轮换策略

MySQL 8.0 引入了对密码重用的限制。限制可以在全局级别以及单个用户级别进行配置。密码历史记录是安全的,因为它可能会提供有关个人用户在更改密码时使用的习惯或模式的线索。密码轮换策略是对其他现有机制(如密码过期策略允许的密码策略)的补充。请参阅密码管理。

减缓对用户密码的暴力攻击

MySQL 8.0 在身份验证过程中引入了基于连续登录尝试失败的延迟。目的是减缓对用户密码的暴力攻击。可以配置在引入延迟之前连续尝试失败的次数以及引入的最大延迟量。

停用 skip-grant-tables

MySQL 8.0 不允许在服务器使用 启动时进行远程连接。另请参阅 Omar Bourja 报告的 Bug#79027。–skip-grant-tables

向服务器添加mysqld_safe功能

MySQL 8.0 实现了当前在服务器内部脚本中找到的部分逻辑。此工作提高了某些情况下的服务器可用性,例如,在使用 startup 选项时。这项工作还使用户对 的依赖程度降低,我们希望将来能将其删除。它还修复了 Peter Laursen 报告的 Bug#75343。mysqld_safe--daemonizemysqld_safe script

性能

MySQL 8.0 为读/写工作负载、IO 绑定工作负载和高争用“热点”工作负载提供了更好的性能。此外,新的 Resource Group 功能为用户提供了一个选项,可以通过将用户线程映射到 CPU 来优化特定硬件上的特定工作负载。

扩展读/写工作负载
MySQL 8.0 在 RW 和繁重的写入工作负载上具有良好的扩展性。在密集型 RW 工作负载上,我们观察到 4 个并发用户的性能更好,与 MySQL 5.7 相比,在高负载下的性能提高了 2 倍以上。可以说,虽然 5.7 显著提高了只读工作负载的可扩展性,但 8.0 显著提高了读/写工作负载的可扩展性。效果是 MySQL 提高了标准服务器端硬件(如具有 2 个 CPU 插槽的系统)的硬件利用率(效率)。这种改进是由于重新设计了 InnoDB 写入 REDO 日志的方式。与用户线程不断争相记录其数据更改的历史实现相比,在新的 REDO 日志解决方案中,用户线程现在是无锁的,REDO 写入和刷新由专用的后台线程管理,整个 REDO 处理成为事件驱动的。在此处查看 Dimitri Kravtchuk 的博客文章。
利用 IO 容量(快速存储)
MySQL 8.0 允许用户充分利用每个存储设备。例如,使用 Intel Optane 闪存设备进行测试时,我们能够在完全 IO 绑定的工作负载中超过 1M 点选择 QPS。(IO 绑定意味着数据不缓存在缓冲池中,但必须从辅助存储中检索)。这种改进是由于摆脱了全局锁。fil_system_mutex
在高争用负载(“热行”)
上具有更好的性能

MySQL 8.0 显著提高了高争用工作负载的性能。当多个事务正在等待表中同一行的锁定时,会出现高争用工作负载,从而导致等待事务排队。许多实际工作负载并不平稳,例如一天,但可能会在某些时间突增(帕累托分布式)。MySQL 8.0 在每秒事务数、平均延迟和第 95 个百分位延迟方面都更好地处理此类突发。对最终用户的好处是更好的硬件利用率(效率),因为系统需要的备用容量更少,因此可以在更高的平均负载下运行。原始补丁由 Jiamin Huang (Bug#84266) 提供。请在此处研究 Contention-Aware Transaction Scheduling (CATS) 算法,并阅读 Jiamin Huang 和 Sunny Bains 的 MySQL 博客文章。

资源组

MySQL 8.0 为 MySQL 引入了全局资源组。借助资源组,DevOps/DBA 可以管理用户/系统线程与 CPU 之间的映射。这可用于在 CPU 之间拆分工作负载,以在某些使用案例中获得更好的效率和/或性能。因此,Resource Groups 向 DBA 工具箱中添加了一个工具,该工具可以帮助 DBA 提高硬件利用率或提高查询稳定性。例如,在 Intel(R) Xeon (R) CPU E7-4860 2.27 GHz 40 核-HT 机箱上运行 Sysbench RW 工作负载时,我们通过将写入负载限制为 10 个内核,将整体吞吐量提高了一倍。资源组是一个相当先进的工具,需要熟练的 DevOps/DBA 才能有效使用,因为效果会随着负载类型和手头的硬件而变化。

其他功能

更好的默认值

在 MySQL 团队中,我们密切关注 MySQL 的默认配置,并致力于让用户获得最佳的开箱即用体验。MySQL 8.0 已将 30 多个默认值更改为我们认为更好的值。请参阅博客文章 MySQL 8.0 中的新默认值。Mogan Tocker 的一篇博文概述了这样做的动机。

协议

MySQL 8.0 添加了一个选项,用于关闭结果集的元数据生成和传输。构建/解析和发送/接收结果集元数据会消耗服务器、客户端和网络资源。在某些情况下,元数据大小可能比实际结果数据大小大得多,并且根本不需要元数据。我们可以通过完全禁用这些数据的生成和存储来显著加快查询结果的传输速度。如果客户端不希望元数据与结果集一起返回,则可以设置该标志。CLIENT_OPTIONAL_RESULTSET_METADATA

 C 客户端 API

MySQL 8.0 通过稳定的接口扩展了 libmysql 的 C API,用于从服务器获取复制事件作为数据包流。目的是避免必须调用未记录的 API 并打包内部头文件,以便实现基于二进制日志的程序,例如 MySQL Applier for Hadoop。

Memcached 的

MySQL 8.0 通过多个 get 操作和对范围查询的支持增强了 InnoDB Memcached 功能。我们添加了对多个 get 操作的支持,以进一步提高读取性能,即用户可以在单个 memcached 查询中获取多个键值对。Yoshinori @ Facebook 已请求支持范围查询。使用范围查询,用户可以指定特定范围,并获取此范围内的所有限定值。这两个功能都可以显著减少客户端和服务器之间的往返次数。

持久 Autoinc 计数器

MySQL 8.0 通过将计数器写入重做日志来保留计数器。这是对非常旧的 Bug#199 的修复。MySQL 恢复过程将重播重做日志并确保计数器的值正确。不会有任何 counters 回滚。这意味着数据库恢复将在崩溃后重新建立最后一个已知的计数器值。它保证 counter 不能两次获得相同的值。计数器单调递增,但请注意,可能存在间隙 (未使用的值)。过去,缺乏持久化被认为是麻烦的,例如,请参阅 Stephen Dewey 在 2006 年报告的 Bug#21641 或这篇博文。AUTOINCAUTOINCAUTOINCAUTOINCAUTOINC

总结

如上所示,MySQL 8.0 附带了大量新功能和性能改进。从 dev.mysql.com 下载并试用!

您还可以将现有的 MySQL 5.7 升级到 MySQL 8.0。在此过程中,您可能想尝试新 MySQL Shell (mysqlsh) 附带的新 Upgrade Checker。此实用程序将分析您现有的 5.7 服务器,并告诉您潜在的 8.0 不兼容问题。另一个很好的资源是 Frédéric Descamps 的博客文章 Migrating to MySQL 8.0 without break old application。

在这篇博文中,我们介绍了 Server 功能。还有更多!我们还将发布有关其他功能的博客文章,例如复制、组复制、InnoDB 集群、文档存储、MySQL Shell、DevAPI 和基于 DevAPI 的连接器(连接器/Node.js、连接器/Python、PHP、连接器/NET、连接器/ODBC、连接器/C++ 和 Connector/J)。

现在就到这里了,感谢您使用 MySQL

提交评论


安全码
刷新

 

自1996年以来,公司一直专注于域名注册、虚拟主机、服务器托管、网站建设、电子商务等互联网服务,不断践行"提供企业级解决方案,奉献个性化服务支持"的理念。作为戴尔"授权解决方案提供商",同时提供与公司服务相关联的硬件产品解决方案。
 

联系方式

地址:河南省郑州市经五路2号

电话:0371-63520088 

QQ:76257322

网站:800188.com

电邮:该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。

微信:用企业微信联系