民审-M

MySQL 8.0新特性新添加的功能详解

作者:民审-M   发布时间:2018-04-27 13:22   回复数:0   浏览数:542
民审-M
5420民审-M金牌草根
2018-04-27 13:22:24
5420 2018-04-27 13:22:24
本帖最后由 民审-M 于 2018-4-27 13:24 编辑

[color=rgb(85, 85, 85)]本节总结了MySQL 8.0中已添加,弃用和删除的内容。伴随部分列出了MySQL 8.0中已添加,弃用或删除的MySQL服务器选项和变量。请参阅 [color=rgb(0, 116, 163)]第1.5节“在MySQL 8.0中添加,弃用或删除的服务器和状态变量和选项”

[color=rgb(85, 85, 85)]在MySQL 8.0中添加的功能


以下功能已添加到MySQL 8.0中:


    [*]
    [color=rgb(85, 85, 85)]数据字典。 MySQL现在整合了一个存储有关数据库对象信息的事务数据字典。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。有关更多信息,请参阅[color=rgb(0, 116, 163)]第14章MySQL数据字典

    [*]
    原子数据定义语句(Atomic DDL)。 原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中。有关更多信息,请参见 [color=rgb(0, 116, 163)]第13.1.1节“原子数据定义语句支持”

    [*]
    安全和帐户管理。 这些增强功能是为了提高安全性并增加DBA在帐户管理方面的灵活性而添加的:


      [*]
      一个新的caching_sha2_password 身份验证插件可用。像sha256_password插件一样 , caching_sha2_password实现SHA-256密码散列,但使用缓存解决连接时的延迟问题。它还支持更多的连接协议,并且不需要与基于RSA密钥对的密码交换功能的OpenSSL进行链接。请参见 [color=rgb(0, 116, 163)]第6.5.1.3节“缓存SHA-2可插入验证”
      该caching_sha2_password和 sha256_password认证插件提供比更安全的密码加密 mysql_native_password插件,并 caching_sha2_password提供了比更好的性能sha256_password。由于这些优越的安全性和性能特点 caching_sha2_password,它现在是首选身份验证插件,并且也是默认身份验证插件而不是mysql_native_password。有关此更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅 [color=rgb(0, 116, 163)]caching_sha2_password作为首选身份验证插件

      [*]
      MySQL现在支持角色,这些角色被命名为特权集合。角色可以创建和删除。角色可以拥有授予和撤消的权限。角色可以授予用户帐户并从其中撤销。可以从授予该帐户的角色中选择适用于某个帐户的活动适用角色,并且可以在该帐户的会话期间对其进行更改。有关更多信息,请参见[color=rgb(0, 116, 163)]部分6.3.4,“使用角色”

      [*]
      MySQL现在维护有关密码历史记录的信息,从而限制重复使用以前的密码。数据库管理员可能要求不要从以前的密码中选择新的密码进行一些密码更改或一段时间。可以在全局和每个帐户的基础上建立密码重用策略。结合现有的密码到期功能以要求定期更改密码,新的密码历史记录功能可让DBA更加全面地控制密码管理。有关更多信息,请参见[color=rgb(0, 116, 163)]第6.3.8节“密码管理”

      [*]
      如果使用OpenSSL进行编译,MySQL现在支持FIPS模式,并且运行时可以使用OpenSSL库和FIPS对象模块。FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对较长密钥长度的要求。请参见[color=rgb(0, 116, 163)]第6.6节“FIPS支持”

    [*]
    资源管理。 MySQL现在支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性启用对其资源的控制,以启用或限制组中线程的资源消耗。DBA可以根据不同的工作负载适当地修改这些属性。目前,CPU时间是可管理的资源,由“ 虚拟CPU ”作为包括CPU核心,超线程,硬件线程等的术语。服务器在启动时确定有多少虚拟CPU可用,并且具有适当权限的数据库管理员可以将这些CPU与资源组相关联,并将线程分配给组。有关更多信息,请参见 [color=rgb(0, 116, 163)]第8.12.5节“资源组”

    [*]
    [color=rgb(85, 85, 85)]InnoDB增强。 增加了这些InnoDB增强功能:



      [*]
      [color=rgb(85, 85, 85)]每次更改值时,当前最大自动增量计数器值都写入重做日志,并保存到每个检查点的引擎专用系统表中。这些更改使当前最大自动增量计数器值在服务器重新启动时保持不变。另外:


        [*]
        服务器重新启动不再取消 AUTO_INCREMENT = N表格选项的作用。如果将自动递增计数器初始化为特定值,或者如果将自动递增计数器值更改为较大值,则新值在服务器重新启动时会持续存在。

        [*]
        在[color=rgb(0, 116, 163)]ROLLBACK 操作之后立即重新启动服务器 不再导致重新分配给回滚事务的自动增量值。

        [*]
        如果将AUTO_INCREMENT 列值修改为大于当前最大自动增量值的值( [color=rgb(0, 116, 163)]UPDATE例如,在操作中),则新值将保持不变,并且后续 [color=rgb(0, 116, 163)]INSERT操作会从新的较大值开始分配自动递增值。


      有关更多信息,请参见 [color=rgb(0, 116, 163)]第15.8.1.5节“InnoDB中的AUTO_INCREMENT处理”和 [color=rgb(0, 116, 163)]InnoDB AUTO_INCREMENT计数器初始化
      [*]
      当遇到索引树破坏时, InnoDB将损坏标志写入重做日志,这使得损坏标志崩溃安全。InnoDB还将内存中损坏标志数据写入每个检查点的引擎专用系统表中。恢复期间,InnoDB从两个位置读取损坏标志,并在将内存表和索引对象标记为损坏之前合并结果。

      [*]
      的InnoDB 分布式缓存插件支持多个 get操作(读取在一个单一的多键/值对分布式缓存 查询)和范围查询。请参见 [color=rgb(0, 116, 163)]第15.19.4节“InnoDB memcached多重获取和范围查询支持”

      [*]
      新的动态配置选项 [color=rgb(0, 116, 163)]innodb_deadlock_detect可用于禁用死锁检测。在高并发系统上,当大量线程等待相同的锁时,死锁检测会导致速度下降。有时候,[color=rgb(0, 116, 163)]innodb_lock_wait_timeout 当死锁发生时,禁用死锁检测并依赖事务回滚的设置可能更有效 。

      [*]
      新 [color=rgb(0, 116, 163)]INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表报告InnoDB每个索引缓冲池中缓存的索引页数 。

      [*]
      所有InnoDB临时表现在都在共享临时表空间中创建, ibtmp1。

      [*]
      该InnoDB [color=rgb(0, 116, 163)]表空间加密功能支持重做日志的加密和撤消日志数据。请参阅 [color=rgb(0, 116, 163)]重做日志数据加密和 [color=rgb(0, 116, 163)]撤消日志数据加密

      [*]
      InnoDB支持 NOWAIT和SKIP LOCKED选项,SELECT ... FOR SHARE并SELECT ... FOR UPDATE锁定读取语句。 NOWAIT如果请求的行被另一个事务锁定,则会立即返回语句。SKIP LOCKED从结果集中删除锁定的行。请参阅 [color=rgb(0, 116, 163)]使用NOWAIT锁定读取并发性并跳过锁定
      SELECT ... FOR SHARE替换 SELECT ... LOCK IN SHARE MODE,但 LOCK IN SHARE MODE仍可用于向后兼容。这些陈述是等同的。然而,FOR UPDATE和 FOR SHARE支持 NOWAIT,SKIP LOCKED和选项。请参见[color=rgb(0, 116, 163)]第13.2.10节“SELECT语法”。 OF tbl_name
      OF tbl_name 将锁定查询应用于指定的表。

      [*]
      ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITION [color=rgb(0, 116, 163)]ALTER TABLE选项由本地分区就地API的支持,可能与使用 ALGORITHM={COPY|INPLACE}和 LOCK条款。
      DROP PARTITION与 ALGORITHM=INPLACE存储在该分区删除数据并丢弃分区。但是, DROP PARTITION使用 ALGORITHM=COPY或 [color=rgb(0, 116, 163)]old_alter_table=ON 重建分区表并尝试将数据从丢弃的分区移动到具有兼容PARTITION ... VALUES 定义的另一个分区。无法移动到另一个分区的数据被删除。

      [*]
      该InnoDB存储引擎现在使用MySQL的数据字典,而不是它自己的存储引擎特定的数据字典。有关数据字典的信息,请参阅 [color=rgb(0, 116, 163)]第14章MySQL数据字典

      [*]
      mysql系统表和数据字典表现在创建在MySQL数据目录中InnoDB命名的单个 表空间文件 mysql.ibd中。以前,这些表是InnoDB在mysql数据库目录中的单个表空间文件中创建的。

      [*]
      在MySQL 8.0中引入了以下撤消表空间更改:


        [*]
        现在,可以在运行时或使用[color=rgb(0, 116, 163)]innodb_undo_tablespaces 配置选项重新启动服务器时修改撤消表空间的数量 。此更改允许在数据库增长时添加撤消表空间和回滚段。

        [*]
        [color=rgb(0, 116, 163)]innodb_undo_log_truncate 是默认启用的。请参见 [color=rgb(0, 116, 163)]第15.7.9节“截断撤消表空间”

        [*]
        的 [color=rgb(0, 116, 163)]innodb_undo_tablespaces 默认值从0变更为2,这意味着回退段在两个单独的还原表,而不是创建 InnoDB默认系统表空间。至少需要两个撤消表空间才能允许撤销日志的截断。
        最小值 [color=rgb(0, 116, 163)]innodb_undo_tablespaces 为2,[color=rgb(0, 116, 163)]innodb_undo_tablespaces 不再允许设置 为0。最小值2确保回滚段始终在撤消表空间中创建,而不是在系统表空间中创建。有关更多信息,请参见 [color=rgb(0, 116, 163)]第15.7.8节“配置撤消表空间”

        [*]
        用于撤消表空间文件的命名约定从更改 为 ,其中 是撤消空间编号。 undoNNNundo_NNNNNN

        [*]
        的 [color=rgb(0, 116, 163)]innodb_rollback_segments 配置选项定义每撤消表回退段的数目。以前,它 [color=rgb(0, 116, 163)]innodb_rollback_segments 是一个全局设置,用于指定MySQL实例的回退段的总数。此更改增加了可用于并发事务的回滚段的数量。更多的回滚段增加了并发事务对撤消日志使用单独的回滚段的可能性,从而减少资源争用。

        [*]
        该innodb_undo_logs 配置选项被删除。的 [color=rgb(0, 116, 163)]innodb_rollback_segments 配置选项执行相同的功能,并应被代替使用。

        [*]
        该Innodb_available_undo_logs 状态变量被删除。可以使用检索每个表空间的可用回滚段的数量SHOW VARIABLES LIKE 'innodb_rollback_segments';

      [*]
      修改了影响缓冲池预冲洗和冲洗行为的配置选项的默认值:


        [*]
        该 [color=rgb(0, 116, 163)]innodb_max_dirty_pages_pct_lwm 默认值现在是10。0先前的默认值禁用缓冲池预冲洗。当缓冲池中脏页的百分比超过10%时,值为10将启用预先浮动。启用预冲可提高性能一致性。

        [*]
        将 [color=rgb(0, 116, 163)]innodb_max_dirty_pages_pct 默认值从75到90。增加 InnoDB尝试从缓冲池刷新数据,使脏页的百分比不超过这个值。增加的默认值允许缓冲池中更大比例的脏页面。

      [*]
      现在默认 [color=rgb(0, 116, 163)]innodb_autoinc_lock_mode 设置为2(交错)。交叉锁定模式允许并行执行多行插入,从而提高并发性和可伸缩性。新的 [color=rgb(0, 116, 163)]innodb_autoinc_lock_mode 默认设置反映了从基于语句的复制到基于行的复制的变化,作为MySQL 5.7中的默认复制类型。基于语句的复制需要连续的自动增量锁定模式(以前的默认值)来确保为给定的SQL语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制不会对SQL语句的执行顺序。有关更多信息,请参阅 [color=rgb(0, 116, 163)]InnoDB AUTO_INCREMENT锁定模式
      对于使用基于语句的复制的系统,新的 [color=rgb(0, 116, 163)]innodb_autoinc_lock_mode 默认设置可能会中断依赖于顺序自动增量值的应用程序。要恢复先前的默认值,请设置[color=rgb(0, 116, 163)]innodb_autoinc_lock_mode 为1。

      [*]
      [color=rgb(0, 116, 163)]ALTER TABLESPACE ... RENAME TO语法 支持重命名通用表空间 。

      [*]
      新 [color=rgb(0, 116, 163)]innodb_dedicated_server 配置选项默认情况下处于禁用状态,可用于InnoDB根据服务器上检测到的内存量自动配置以下选项:


      该选项适用于在专用服务器上运行的MySQL服务器实例。有关更多信息,请参见 [color=rgb(0, 116, 163)]第15.6.13节“为专用MySQL服务器启用自动配置”
      [*]
      新 [color=rgb(0, 116, 163)]INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF 视图为表空间提供空间,名称,路径,标志和空间类型数据InnoDB。

      [*]
      与MySQL捆绑在一起 的[color=rgb(0, 116, 163)]zlib库版本从版本1.2.3升级到版本1.2.11。MySQL在zlib库的帮助下实现压缩。
      如果使用InnoDB压缩表,请参见[color=rgb(0, 116, 163)]第2.10.1.2节“影响升级到MySQL 8.0的更改”以了解相关的升级影响。

      [*]
      序列化字典信息(SDI)存在于InnoDB除临时表空间和撤消表空间文件之外的所有表空间文件中。SDI是表和表空间对象的序列化元数据。SDI数据的存在提供元数据冗余。例如,如果数据字典变得不可用,字典对象元数据可能从表空间文件中提取。使用[color=rgb(0, 116, 163)]ibd2sdi工具执行SDI提取 。SDI数据以JSON格式存储 。
      在表空间文件中包含SDI数据会增加表空间文件的大小。SDI记录需要一个索引页面,默认大小为16k。但是,SDI数据在存储时会被压缩以减少存储空间。

      [*]
      该InnoDB存储引擎现在支持原子DDL,这保证了DDL操作要么完全提交或回滚,即使服务器在操作时停止。有关更多信息,请参见[color=rgb(0, 116, 163)]第13.1.1节“原子数据定义语句支持”

      [*]
      使用该[color=rgb(0, 116, 163)]innodb_directories 选项可以在服务器脱机时将表空间文件移动或恢复到新的位置 。有关更多信息,请参见 [color=rgb(0, 116, 163)]第15.7.7节“在服务器处于脱机状态时移动表空间文件”

      [*]
      [color=rgb(85, 85, 85)]以下重做日志优化已实现:


        [*]
        用户线程现在可以并发写入日志缓冲区而不同步写入。

        [*]
        用户线程现在可以按照宽松的顺序将脏页面添加到flush列表中。

        [*]
        现在专用的日志线程负责将日志缓冲区写入系统缓冲区,将系统缓冲区刷新到磁盘,将写入和刷新的重做通知用户线程,维持放宽的清空列表顺序所需的延迟,并编写检查点。

        [*]
        添加了系统变量,用于配置等待刷新重做的用户线程使用旋转延迟:


          [*]
          [color=rgb(0, 116, 163)]innodb_log_wait_for_flush_spin_hwm:定义最大平均日志刷新时间,超过该时间,用户线程在等待刷新重做时不再旋转。

          [*]
          [color=rgb(0, 116, 163)]innodb_log_spin_cpu_abs_lwm:定义最小CPU使用量,低于该值时用户线程在等待刷新重做时不再旋转。

          [*]
          [color=rgb(0, 116, 163)]innodb_log_spin_cpu_pct_hwm:定义CPU使用的最大数量,在此期间用户线程不再在等待刷新的重做时旋转。

        [*]
        该 [color=rgb(0, 116, 163)]innodb_log_buffer_size 配置选项现在是动态的,在服务器运行时,其允许调整日志缓冲区的。


      有关更多信息,请参见 [color=rgb(0, 116, 163)]第8.5.4节“优化InnoDB重做日志记录”

    [*]
    字符集支持。 默认字符集已从更改 latin1为utf8mb4。该utf8mb4字符集有几个新的排序规则,其中包括 utf8mb4_ja_0900_as_cs,提供对Unicode在MySQL中第一个日本特定语言的排序规则。有关更多信息,请参见 [color=rgb(0, 116, 163)]第10.10.1节“Unicode字符集”

    [*]
    JSON增强。 对MySQL的JSON功能进行了以下增强或增加:


      [*]
      添加了 [color=rgb(0, 116, 163)]->> (内联路径)运算符,这相当于调用 [color=rgb(0, 116, 163)]JSON_UNQUOTE()结果[color=rgb(0, 116, 163)]JSON_EXTRACT()
      这是[color=rgb(0, 116, 163)]-> MySQL 5.7中引入的列路径运算符的改进 ; col->>"$.path"相当于 JSON_UNQUOTE(col->"$.path")。内联路径运算符可以用来随时随地可以使用JSON_UNQUOTE(JSON_EXTRACT()),如 [color=rgb(0, 116, 163)]SELECT列清单, WHERE和HAVING 条款,并ORDER BY和 GROUP BY条款。有关更多信息,请参阅运算符的说明以及[color=rgb(0, 116, 163)]第12.16.8节“JSON路径语法”

      [*]
      增加了两个JSON聚合函数 [color=rgb(0, 116, 163)]JSON_ARRAYAGG()和 [color=rgb(0, 116, 163)]JSON_OBJECTAGG()。 JSON_ARRAYAGG()将列或表达式作为其参数,并将结果汇总为单个[color=rgb(0, 116, 163)]JSON数组。该表达式可以评估为任何MySQL数据类型; 这不一定是一个JSON价值。 JSON_OBJECTAGG()将两个列或表达式解释为一个键和一个值; 它将结果作为单个JSON 对象返回。有关更多信息和示例,请参见 [color=rgb(0, 116, 163)]第12.19节“聚合(GROUP BY)函数”

      [*]
      添加了JSON实用程序功能[color=rgb(0, 116, 163)]JSON_PRETTY(),该功能 [color=rgb(0, 116, 163)]JSON 以易于阅读的格式输出现有值; 每个JSON对象成员或数组值都打印在一个单独的行上,并且子对象或数组的打算是相对于其父项的两个空格。
      这个函数也可以处理一个可以被解析为JSON值的字符串。
      有关更多详细信息和示例,请参见 [color=rgb(0, 116, 163)]第12.16.7节“JSON实用程序函数”

      [*]
      [color=rgb(0, 116, 163)]JSON在使用查询 排序值时ORDER BY,每个值现在由排序关键字的可变长度部分表示,而不是固定1K大小的一部分。在很多情况下,这可以减少过度使用; 例如,一个标量INT或偶 BIGINT数值实际上只需要很少的字节,所以这个空间的剩余部分(高达90%或更多)被填充占用。此更改对性能具有以下好处:


        [*]
        现在可以更有效地使用排序缓冲区空间,因此文件排序不需要像定长排序键那样尽早或经常刷新到磁盘。这意味着更多的数据可以在内存中排序,避免不必要的磁盘访问。

        [*]
        较短的密钥可以比较长的密钥更快地进行比较,从而显着改善性能。这对于完全在内存中执行的排序以及需要向磁盘写入和从磁盘读取的排序来说都是如此。

      [*]
      在MySQL 8.0.2中增加了对JSON列值进行部分原地更新的支持,这比完全删除现有JSON值并在其位置编写新的JSON值更有效,就像以前在更新任何JSON列时所做的那样。要应用这种优化,更新,必须使用应用 [color=rgb(0, 116, 163)]JSON_SET(), [color=rgb(0, 116, 163)]JSON_REPLACE()或 [color=rgb(0, 116, 163)]JSON_REMOVE()。新元素无法添加到正在更新的JSON文档中; 文档中的值不会比更新之前占用更多的空间。请参阅 [color=rgb(0, 116, 163)]部分更新的JSON值,详细讨论这些要求。
      可以将部分JSON文档更新写入二进制日志,占用的空间少于记录完整JSON文档的空间。当使用基于语句的复制时,部分更新始终会被记录。为了与基于行的复制一起工作,您必须先设置 [color=rgb(0, 116, 163)]binlog_row_value_options=PARTIAL_JSON; 请参阅此变量的说明以获取更多信息。

      [*]
      添加了JSON实用程序功能 [color=rgb(0, 116, 163)]JSON_STORAGE_SIZE()和 [color=rgb(0, 116, 163)]JSON_STORAGE_FREE()。 JSON_STORAGE_SIZE()在任何部分更新之前返回用于JSON文档二进制表示的字节存储空间(请参阅前一项)。 JSON_STORAGE_FREE()显示[color=rgb(0, 116, 163)]JSON使用JSON_SET()or 部分更新后,类型表列中剩余的空间量 JSON_REPLACE(); 如果新值的二进制表示小于以前的值,则该值大于零。
      这些函数中的每一个还接受JSON文档的有效字符串表示。对于这样的值, JSON_STORAGE_SIZE()返回其二进制表示在转换为JSON文档后使用的空间。对于包含JSON文档的字符串表示形式的变量, JSON_STORAGE_FREE()返回零。如果它的(非空)参数不能被解析为有效的JSON文档,并且NULL参数是,则 任何函数都会产生错误NULL。
      有关更多信息和示例,请参见 [color=rgb(0, 116, 163)]第12.16.7节“JSON实用程序函数”
      JSON_STORAGE_SIZE()并 JSON_STORAGE_FREE()在MySQL 8.0.2中实现。

      [*]
      在MySQL 8.0.2中增加了对$[1 to 5]XPath表达式等范围的支持 。还在此版本中为last关键字和相对寻址添加了支持 ,以便$[last]始终选择数组中最后一个(编号最大的)元素和 $[last-1]最后一个元素的下一个元素。 last并且使用它的表达式也可以包含在范围定义中; 例如, $[last-2 to last-1]返回数组中的最后两个元素。有关其他信息和示例,请参阅 [color=rgb(0, 116, 163)]搜索和修改JSON值

      [*]
      添加了符合[color=rgb(0, 116, 163)]RFC 7396的JSON合并功能 。 [color=rgb(0, 116, 163)]JSON_MERGE_PATCH()在2个JSON对象上使用时,将它们合并到一个JSON对象中,该对象具有以下集合的联合成员:


        [*]
        第一个对象的每个成员都没有成员,第二个对象中具有相同的键。

        [*]
        没有成员的第二个对象的每个成员在第一个对象中具有相同的键,并且其值不是JSON null文本。

        [*]
        每个成员都有一个存在于两个对象中的键,而其第二个对象中的值不是JSON null文字。


      作为这项工作的一部分,该 [color=rgb(0, 116, 163)]JSON_MERGE()功能已被重新命名 [color=rgb(0, 116, 163)]JSON_MERGE_PRESERVE()。 JSON_MERGE()继续被认为是JSON_MERGE_PRESERVE()MySQL 8.0中的别名,但现在已被弃用,并且可能在未来版本的MySQL中被删除。
      有关更多信息和示例,请参见 [color=rgb(0, 116, 163)]第12.16.4节“修改JSON值的函数”
      [*]
      实现了“ 最后重复密钥获胜 ” 重复密钥规范化,符合 [color=rgb(0, 116, 163)]RFC 7159和大多数JavaScript解析器。此处显示了此行为的一个示例,其中仅x保留了具有密钥的最右侧成员:
      [color=rgb(166, 127, 89)]mysql> [color=rgb(0, 119, 170)]SELECT [color=rgb(221, 74, 104)]JSON_OBJECT[color=rgb(153, 153, 153)]([color=rgb(102, 153, 0)]'x'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'32'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'y'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'[true, false]'[color=rgb(153, 153, 153)],      [color=rgb(166, 127, 89)]>                     [color=rgb(102, 153, 0)]'x'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'"abc"'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'x'[color=rgb(153, 153, 153)], [color=rgb(102, 153, 0)]'100'[color=rgb(153, 153, 153)]) [color=rgb(0, 119, 170)]AS Result[color=rgb(153, 153, 153)];[color=rgb(85, 85, 85)]+------------------------------------+[color=rgb(85, 85, 85)]| Result                             |[color=rgb(85, 85, 85)]+------------------------------------+[color=rgb(85, 85, 85)]| {"x": "100", "y": "[true, false]"} |[color=rgb(85, 85, 85)]+------------------------------------+[color=rgb(85, 85, 85)]1 row in set (0.00 sec)
      插入到MySQL [color=rgb(0, 116, 163)]JSON列中的值 也以这种方式标准化,如下例所示:
      [color=rgb(166, 127, 89)]mysql> [color=rgb(0, 119, 170)]CREATE [color=rgb(0, 119, 170)]TABLE t1 [color=rgb(153, 153, 153)](c1 [color=rgb(131, 70, 137)]JSON[color=rgb(153, 153, 153)])[color=rgb(153, 153, 153)];[color=rgb(166, 127, 89)]mysql> [color=rgb(0, 119, 170)]INSERT [color=rgb(0, 119, 170)]INTO t1 [color=rgb(0, 119, 170)]VALUES [color=rgb(153, 153, 153)]([color=rgb(102, 153, 0)]'{"x": 17, "x": "red", "x": [3, 5, 7]}'[color=rgb(153, 153, 153)])[color=rgb(153, 153, 153)];[color=rgb(166, 127, 89)]mysql> [color=rgb(0, 119, 170)]SELECT c1 [color=rgb(0, 119, 170)]FROM t1[color=rgb(153, 153, 153)];[color=rgb(85, 85, 85)]+------------------+[color=rgb(85, 85, 85)]| c1               |[color=rgb(85, 85, 85)]+------------------+[color=rgb(85, 85, 85)]| {"x": [3, 5, 7]} |[color=rgb(85, 85, 85)]+------------------+
      这是与以前版本的MySQL不兼容的变化, 在这种情况下使用了“ 第一个重复键赢 ”算法。
      有关更多信息和示例[color=rgb(0, 116, 163)]请参阅[color=rgb(0, 116, 163)]规范化,合并和自动套接JSON值

      [*]
      [color=rgb(0, 116, 163)]JSON_TABLE() 在MySQL 8.0.4中 添加了该功能。该函数接受JSON数据并将其作为具有指定列的关系表返回。
      此函数具有语法 ,其中 是返回JSON数据的表达式,是应用于源的JSON路径,并且 是列定义的列表。这里显示一个例子: JSON_TABLE(expr, path COLUMNScolumn_list) [AS] alias)exprpathcolumn_list
      [color=rgb(166, 127, 89)]mysql> SELECT [color=rgb(166, 127, 89)]* [color=rgb(166, 127, 89)]    -> [color=rgb(0, 119, 170)]FROM  [color=rgb(166, 127, 89)]    ->   JSON_TABLE[color=rgb(153, 153, 153)]([color=rgb(166, 127, 89)]    ->     [color=rgb(102, 153, 0)]'[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]'[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->     [color=rgb(102, 153, 0)]"$
      [*][color=rgb(102, 153, 0)]" COLUMNS[color=rgb(153, 153, 153)]([color=rgb(166, 127, 89)]    ->       rowid FOR ORDINALITY[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->   [color=rgb(166, 127, 89)]    ->       xa INT EXISTS PATH [color=rgb(102, 153, 0)]"$.a"[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->       xb INT EXISTS PATH [color=rgb(102, 153, 0)]"$.b"[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->       [color=rgb(166, 127, 89)]    ->       sa VARCHAR[color=rgb(153, 153, 153)]([color=rgb(153, 0, 85)]100[color=rgb(153, 153, 153)]) PATH [color=rgb(102, 153, 0)]"$.a"[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->       sb VARCHAR[color=rgb(153, 153, 153)]([color=rgb(153, 0, 85)]100[color=rgb(153, 153, 153)]) PATH [color=rgb(102, 153, 0)]"$.b"[color=rgb(153, 153, 153)],[color=rgb(166, 127, 89)]    ->       [color=rgb(166, 127, 89)]    ->       ja JSON PATH [color=rgb(102, 153, 0)]"$.a"[color=rgb(153, 153, 153)],       [color=rgb(166, 127, 89)]    ->       jb JSON PATH [color=rgb(102, 153, 0)]"$.b"[color=rgb(166, 127, 89)]    ->     [color=rgb(153, 153, 153)])   [color=rgb(166, 127, 89)]    ->   [color=rgb(153, 153, 153)]) AS  jt1[color=rgb(153, 153, 153)];[color=rgb(85, 85, 85)]+-------+------+------+------+------+------+--------+[color=rgb(85, 85, 85)]| rowid | xa   | xb   | sa   | sb   | ja   | jb     |[color=rgb(85, 85, 85)]+-------+------+------+------+------+------+--------+[color=rgb(85, 85, 85)]|     1 |    1 |    1 | 3    | 0    | 3    | "0"    |[color=rgb(85, 85, 85)]|     2 |    1 |    1 | 3    | 1    | "3"  | "1"    |[color=rgb(85, 85, 85)]|     3 |    1 |    1 | 2    | 1    | 2    | 1      |[color=rgb(85, 85, 85)]|     4 |    1 |    0 | 0    | NULL | 0    | NULL   |[color=rgb(85, 85, 85)]|     5 |    0 |    1 | NULL | NULL | NULL | [1, 2] |[color=rgb(85, 85, 85)]+-------+------+------+------+------+------+--------+
      JSON源表达式可以是任何生成有效JSON文档的表达式,包括JSON文本,表列或返回JSON的函数调用,如[color=rgb(0, 116, 163)]JSON_EXTRACT(t1, data, '$.post.comments')。有关更多信息,请参见 [color=rgb(0, 116, 163)]第12.16.6节“JSON表函数”

    [*]
    优化。 这些优化器增强功能被添加:


      [*]
      MySQL现在支持不可见索引。优化器根本不使用不可见索引,但通常保持不变。索引默认是可见的。不可见的索引可以测试删除索引对查询性能的影响,而不会做出必须撤销的破坏性更改,如果索引变为需要的话。参见 [color=rgb(0, 116, 163)]第8.3.12节“不可见索引”

      [*]
      MySQL现在支持降序索引: DESC在索引定义中不再被忽略,但会导致键值按降序存储。以前,索引可能会以相反顺序扫描,但性能会受到影响。可以按照顺序扫描降序索引,这是更高效的。降序索引还使得优化器可以在最有效的扫描顺序混合某些列的升序和其他列的降序时使用多列索引。请参见[color=rgb(0, 116, 163)]第8.3.13节“降序索引”

    [*]
    公用表表达式。 MySQL现在支持通用表表达式,既是非递归的,也是非递归的。通用表表达式允许使用命名临时结果集,通过允许[color=rgb(0, 116, 163)]WITH子句前面的[color=rgb(0, 116, 163)]SELECT语句和某些其他语句来实现。有关更多信息,请参见 [color=rgb(0, 116, 163)]第13.2.13节“WITH语法(公用表表达式)”

    [*]
    窗口功能。 MySQL现在支持窗口函数,对于查询中的每一行,使用与该行相关的行执行计算。这些包括诸如 [color=rgb(0, 116, 163)]RANK(), [color=rgb(0, 116, 163)]LAG(),和 [color=rgb(0, 116, 163)]NTILE()。另外,现在几个现有的聚合函数可以用作窗口函数; 例如, [color=rgb(0, 116, 163)]SUM()和 [color=rgb(0, 116, 163)]AVG()。有关更多信息,请参见[color=rgb(0, 116, 163)]第12.20节“窗口函数”

    [*]
    正则表达式支持。 以前,MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符([color=rgb(0, 116, 163)]REGEXP, [color=rgb(0, 116, 163)]RLIKE)。正则表达式支持已使用Unicode国际组件(ICU)重新实现,该组件提供全面的Unicode支持并且是多字节安全的。该 [color=rgb(0, 116, 163)]REGEXP_LIKE()函数以[color=rgb(0, 116, 163)]REGEXP和 [color=rgb(0, 116, 163)]RLIKE 运算符的方式执行正则表达式匹配 ,现在它们是该函数的同义词。此外, [color=rgb(0, 116, 163)]REGEXP_INSTR(), [color=rgb(0, 116, 163)]REGEXP_REPLACE(),和 [color=rgb(0, 116, 163)]REGEXP_SUBSTR()函数可用于查找匹配位置并分别执行子字符串替换和提取。该 [color=rgb(0, 116, 163)]regexp_stack_limit和[color=rgb(0, 116, 163)]regexp_time_limit系统变量提供了通过发动机匹配的资源消耗的控制。有关更多信息,请参见 [color=rgb(0, 116, 163)]第12.5.2节“正则表达式”。有关使用正则表达式的应用程序可能会受到实现更改影响的方式的信息,请参阅 [color=rgb(0, 116, 163)]正则表达式兼容性注意事项

    [*]
    内部临时表。 的TempTable存储引擎替换MEMORY存储引擎作为默认发动机用于在内存中的内部临时表。该TempTable存储引擎提供了有效的存储 [color=rgb(0, 116, 163)]VARCHAR和 [color=rgb(0, 116, 163)]VARBINARY列。的 [color=rgb(0, 116, 163)]internal_tmp_mem_storage_engine 会话变量定义了用于在存储器内的临时表的存储引擎。允许的值是 TempTable(默认值)和 MEMORY。的[color=rgb(0, 116, 163)]temptable_max_ram 配置选项定义的存储器,所述最大数量TempTable之前的数据被存储到磁盘存储引擎可以使用。

    [*]
    日志记录。 错误日志记录被重写为使用MySQL组件体系结构。传统错误日志记录是使用内置组件实现的,并且使用系统日志进行日志记录是作为可加载组件实现的。另外,还有一个可加载的JSON日志记录器。要控制启用哪些日志组件,请使用 [color=rgb(0, 116, 163)]log_error_services系统变量。有关更多信息,请参见 [color=rgb(0, 116, 163)]第5.4.2节“错误日志”

    [*]
    备份锁。 一种新的备份锁允许在线备份期间的DML,同时防止可能导致快照不一致的操作。新的备份锁由[color=rgb(0, 116, 163)]LOCK INSTANCE FOR BACKUP 和 [color=rgb(0, 116, 163)]UNLOCK INSTANCE语法支持 。该 [color=rgb(0, 116, 163)]BACKUP_ADMIN权限才能使用这些语句。

    [*]
    复制。 MySQL复制有以下增强功能:


      [*]
      MySQL复制现在支持使用紧凑的二进制格式对JSON文档进行部分更新的二进制日志记录,从而节省日志中记录完整JSON文档的空间。这种紧凑的日志记录是在基于语句的日志记录正在使用时自动完成的,并且可以通过设置新的binlog_row_value_options系统变量来启用 PARTIAL_JSON。有关更多信息,请参阅[color=rgb(0, 116, 163)]JSON值的部分更新以及描述 [color=rgb(0, 116, 163)]binlog_row_value_options





[color=rgb(85, 85, 85)]特性在MySQL 8.0中不推荐使用


以下功能在MySQL 8.0中不推荐使用,并且可能会在未来的系列中删除。在显示替代品的地方,应该更新应用程序以使用它们。
对于那些使用在MySQL 8.0中已弃用的功能的应用程序,它们在更高版本的MySQL系列中已被删除,当从MySQL 8.0主站复制到更高系列的从站时,语句可能会失败,或者可能对主站和从站有不同的影响。为避免此类问题,应修改使用8.0中弃用功能的应用程序,以避免它们,并尽可能使用替代方法。

    [*]
    从MySQL 8.0.4开始,该validate_password 插件已被重新实现以使用服务器组件基础结构。插件形式 validate_password仍然可用,但不推荐使用,将在未来版本的MySQL中删除。使用插件的MySQL安装应该转而使用组件。请参见 [color=rgb(0, 116, 163)]第6.5.3.3节“过渡到密码验证组件”

    [*]
    该[color=rgb(0, 116, 163)]ALTER TABLESPACE和 条款已被弃用。 [color=rgb(0, 116, 163)]DROP TABLESPACE ENGINE

    [*]
    这个[color=rgb(0, 116, 163)]JSON_MERGE()函数从MySQL 8.0.3开始不推荐使用。[color=rgb(0, 116, 163)]JSON_MERGE_PRESERVE() 改为使用 。



[color=rgb(85, 85, 85)]特性在MySQL 8.0中被删除


以下项目已过时并已在MySQL 8.0中删除。在显示替代品的地方,应该更新应用程序以使用它们。
对于使用MySQL 8.0中删除的功能的MySQL 5.7应用程序,当从MySQL 5.7主站复制到MySQL 8.0从站时,语句可能会失败,或者可能对主站和从站有不同的影响。为了避免这些问题,应该修改使用MySQL 8.0中删除的功能的应用程序,以避免它们,并尽可能使用替代方法。

    [*]
    information_schema_stats 在MySQL 8.0.0中引入 的配置选项已被删除,并[color=rgb(0, 116, 163)]information_schema_stats_expiry 在MySQL 8.0.3中被替换 。
    information_schema_stats_expiry为缓存[color=rgb(0, 116, 163)]INFORMATION_SCHEMA表统计信息定义到期设置 。有关更多信息,请参见 [color=rgb(0, 116, 163)]第8.2.3节“优化INFORMATION_SCHEMA查询”

    [*]
    InnoDBMySQL 8.0.3中删除了 与废弃系统表相关的代码。 [color=rgb(0, 116, 163)]INFORMATION_SCHEMA基于InnoDB系统表的视图被数据字典表上的内部系统视图所取代。受影响的 InnoDB[color=rgb(0, 116, 163)]INFORMATION_SCHEMA视图被重命名为:
    表1.1重命名InnoDB信息模式视图
    [td][table=98%,transparent]
    [tr=transparent][td]旧名称[/td][td]新名字[/td][/tr]
    [tr=transparent][td]INNODB_SYS_COLUMNS[/td][td]INNODB_COLUMNS[/td][/tr]
    [tr=transparent][td]INNODB_SYS_DATAFILES[/td][td]INNODB_DATAFILES[/td][/tr]
    [tr=transparent][td]INNODB_SYS_FIELDS[/td][td]INNODB_FIELDS[/td][/tr]
    [tr=transparent][td]INNODB_SYS_FOREIGN[/td][td]INNODB_FOREIGN[/td][/tr]
    [tr=transparent][td]INNODB_SYS_FOREIGN_COLS[/td][td]INNODB_FOREIGN_COLS[/td][/tr]
    [tr=transparent][td]INNODB_SYS_INDEXES[/td][td]INNODB_INDEXES[/td][/tr]
    [tr=transparent][td]INNODB_SYS_TABLES[/td][td]INNODB_TABLES[/td][/tr]
    [tr=transparent][td]INNODB_SYS_TABLESPACES[/td][td]INNODB_TABLESPACES[/td][/tr]
    [tr=transparent][td]INNODB_SYS_TABLESTATS[/td][td]INNODB_TABLESTATS[/td][/tr]
    [tr=transparent][td]INNODB_SYS_VIRTUAL[/td][td]INNODB_VIRTUAL[/td][/tr]
    [/table]



    升级到MySQL 8.0.3或更高版本后,更新任何引用先前InnoDB [color=rgb(0, 116, 163)]INFORMATION_SCHEMA视图名称的脚本。

    [*]
    以下与帐户管理相关的功能已被删除:


      [*]
      使用[color=rgb(0, 116, 163)]GRANT创建用户。相反,使用[color=rgb(0, 116, 163)]CREATE USER。遵循这种做法使 NO_AUTO_CREATE_USERSQL模式对于[color=rgb(0, 116, 163)]GRANT 语句无关紧要,因此它也被删除。

      [*]
      使用[color=rgb(0, 116, 163)]GRANT修改特权分配以外的帐户属性。这包括身份验证,SSL和资源限制属性。相反,在创建账户时建立这些属性,[color=rgb(0, 116, 163)]CREATE USER或者随后修改它们 [color=rgb(0, 116, 163)]ALTER USER

      [*]
      IDENTIFIED BY PASSWORD 'hash_string' 语法[color=rgb(0, 116, 163)]CREATE USER 和[color=rgb(0, 116, 163)]GRANT。相反, 用于 和 ,其 值的格式与指定的插件兼容。 IDENTIFIED WITH auth_plugin AS 'hash_string'[color=rgb(0, 116, 163)]CREATE USER[color=rgb(0, 116, 163)]ALTER USER'hash_string'
      此外,由于IDENTIFIED BY PASSWORD语法已被删除, [color=rgb(0, 116, 163)]log_builtin_as_identified_by_password 系统变量是多余的,并已被删除。

      [*]
      该PASSWORD()功能。此外,PASSWORD()删除意味着 语法不再可用。 [color=rgb(0, 116, 163)]SET PASSWORD ... = PASSWORD('auth_string')

      [*]
      该[color=rgb(0, 116, 163)]old_passwords 系统变量。

    [*]
    查询缓存已被删除。删除包括这些项目:


    这些不推荐使用的查询缓存项目保留不推荐使用,但不起作用,并且将在未来的MySQL版本中删除:

      [*]
      在SQL_CACHE和 SQL_NO_CACHE [color=rgb(0, 116, 163)]SELECT修饰。

      [*]
      该ndb_cache_check_time系统变量。


    该have_query_cache系统变量仍然是过时的,总是有一个值 NO,并会在将来的MySQL版本中删除。
    [*]
    数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称以查找数据库。因此, --ignore-db-dir选项和 ignore_db_dirs系统变量是无关的并且已被删除。

    [*]
    该tx_isolation和 tx_read_only系统变量已被删除。使用 [color=rgb(0, 116, 163)]transaction_isolation而 [color=rgb(0, 116, 163)]transaction_read_only 不是。

    [*]
    该sync_frm系统变量已被删除,因为.frm文件已经过时。

    [*]
    该secure_auth系统变量和 --secure-auth客户端选项已被删除。C API函数的MYSQL_SECURE_AUTH选项[color=rgb(0, 116, 163)]mysql_options()已被删除。

    [*]
    该multi_range_count系统变量已被删除。

    [*]
    该log_warnings系统变量和 --log-warnings服务器选项已被删除。改用 [color=rgb(0, 116, 163)]log_error_verbosity系统变量。

    [*]
    [color=rgb(0, 116, 163)]sql_log_bin系统变量 的全局范围 已被删除。sql_log_bin仅具有会话范围,并且@@global.sql_log_bin应该调整依赖访问的应用程序 。

    [*]
    这些过时兼容性SQL模式已被删除: DB2,MAXDB, MSSQL,MYSQL323, MYSQL40,ORACLE, POSTGRESQL, NO_FIELD_OPTIONS, NO_KEY_OPTIONS,NO_TABLE_OPTIONS。它们不能再分配给sql_mode系统变量或作为[color=rgb(0, 116, 163)]mysqldump [color=rgb(0, 116, 163)]--compatible选项的允许值使用 。
    删除MAXDB意味着 TIMESTAMP数据类型为 [color=rgb(0, 116, 163)]CREATE TABLE或 [color=rgb(0, 116, 163)]ALTER TABLE不再被视为[color=rgb(0, 116, 163)]DATETIME

    [*]
    未使用date_format, datetime_format, time_format,和 max_tmp_tables系统变量已被删除。

    [*]
    在EXTENDED与 PARTITIONS该关键字 [color=rgb(0, 116, 163)]EXPLAIN声明已被删除。这些关键字是不必要的,因为它们的效果总是启用

    [*]
    这些与加密相关的项目已被删除:


      [*]
      该[color=rgb(0, 116, 163)]ENCODE()和 [color=rgb(0, 116, 163)]DECODE()功能。

      [*]
      该[color=rgb(0, 116, 163)]ENCRYPT()功能。

      [*]
      的[color=rgb(0, 116, 163)]DES_ENCRYPT(),和 [color=rgb(0, 116, 163)]DES_DECRYPT()功能的[color=rgb(0, 116, 163)]--des-key-file 选项,[color=rgb(0, 116, 163)]have_crypt 系统变量,则DES_KEY_FILE 该选项[color=rgb(0, 116, 163)]FLUSH 语句和HAVE_CRYPT CMake的选项。


    取代已删除的加密函数:对于 [color=rgb(0, 116, 163)]ENCRYPT(),请考虑使用 [color=rgb(0, 116, 163)]SHA2()单向散列。对于其他人,请考虑使用 [color=rgb(0, 116, 163)]AES_ENCRYPT(), [color=rgb(0, 116, 163)]AES_DECRYPT()而不是。
    [*]
    在MySQL 5.7中,多个名称下可用的几个空间函数已被弃用,以使空间函数名称空间更加一致,目标是如果每个空间函数名称ST_执行精确操作,或者MBR执行基于最小边界矩形的操作。在MySQL 8.0中,废弃的函数被去除仅离开对应的ST_和 MBR功能:


      [*]
      这些功能有利于去除的 MBR名字: Contains(), Disjoint(), Equals(), Intersects(), Overlaps(), Within()。

      [*]
      这些功能有利于去除的 ST_名字:Area(), AsBinary(), AsText(),AsWKB(), AsWKT(),Buffer(), Centroid(), ConvexHull(), Crosses(),Dimension(), Distance(), EndPoint(), Envelope(), ExteriorRing(), GeomCollFromText(), GeomCollFromWKB(), GeomFromText(),GeomFromWKB(), GeometryCollectionFromText(), GeometryCollectionFromWKB(), GeometryFromText(), GeometryFromWKB(), GeometryN(),GeometryType(), InteriorRingN(), IsClosed(), IsEmpty(),
游客
登录后才可以回帖,登录 或者 注册