# 1.3 MySQL 8.0 中的新功能

本节总结了 MySQL 8.0 中添加、弃用和删除的内容。配套部分列出了 MySQL 8.0 中添加、弃用或删除的 MySQL 服务器选项和变量;看第 1.4 节,“MySQL 8.0 中添加、弃用或删除的服务器和状态变量和选项”.

# MySQL 8.0 中添加的功能

MySQL 8.0 添加了以下功能:

  • **数据字典。**MySQL 现在合并了一个事务数据字典,用于存储有关数据库对象的信息。在以前的 MySQL 版本中,字典数据存储在元数据文件和非事务表中。有关详细信息,请参阅第 14 章,MySQL 数据字典.

  • **原子数据定义语句 (Atomic DDL)。**原子 DDL 语句将与 DDL 操作关联的数据字典更新、存储引擎操作和二进制日志写入组合到单个原子事务中。有关详细信息,请参阅第 13.1.1 节,“原子数据定义语句支持”.

  • **升级程序。**以前,安装新版本的MySQL后,MySQL服务器在下次启动时会自动升级数据字典表,之后DBA会调用mysql_升级手动升级系统表mysql模式,以及其他模式中的对象,例如系统架构和用户架构。

    从 MySQL 8.0.16 开始,服务器执行之前由mysql_升级.安装新的 MySQL 版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,并且不依赖于 DBA 调用mysql_升级.此外,服务器会更新帮助表的内容(一些mysql_升级没做)。一个新的- 升级server 选项提供对服务器如何执行自动数据字典和服务器升级操作的控制。有关详细信息,请参阅第 2.11.3 节,“MySQL 升级过程升级了什么”.

  • **安全和帐户管理。**添加这些增强功能是为了提高安全性并在帐户管理中实现更大的 DBA 灵活性:

    • 授予表中的mysql系统数据库现在InnoDB(事务)表。以前,这些是MyISAM(非事务性)表。授权表存储引擎的变化是伴随帐户管理语句行为变化的基础。以前,账户管理声明(例如创建用户要么删除用户) 命名多个用户可能对某些用户成功而对其他用户失败。现在,每条语句都是事务性的,要么对所有命名用户都成功,要么回滚,如果发生任何错误,则无效。如果成功,该语句将写入二进制日志,但如果失败则不会;在这种情况下,会发生回滚并且不会进行任何更改。有关详细信息,请参阅第 13.1.1 节,“原子数据定义语句支持”.

    • 一个新的cache_sha2_password身份验证插件可用。如sha256_password插入,cache_sha2_password实现 SHA-256 密码散列,但使用缓存来解决连接时的延迟问题。它还支持更多传输协议,并且不需要针对基于 RSA 密钥对的密码交换功能的 OpenSSL 链接。看第 6.4.1.2 节,“缓存 SHA-2 可插入身份验证”.

      cache_sha2_passwordsha256_password身份验证插件提供比mysql_native_password插件,和cache_sha2_password提供比sha256_password.由于这些优越的安全性和性能特点cache_sha2_password,它现在是首选的身份验证插件,也是默认的身份验证插件,而不是mysql_native_password.有关更改默认插件对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅缓存_沙2_密码作为首选身份验证插件.

    • MySQL 企业版 SASL LDAP 身份验证插件现在支持 GSSAPI/Kerberos 作为 Linux 上 MySQL 客户端和服务器的身份验证方法。这在应用程序使用 Microsoft Active Directory(默认启用 Kerberos)访问 LDAP 的 Linux 环境中很有用。看LDAP 身份验证方法.

    • MySQL 企业版现在支持一种身份验证方法,该方法使用户能够使用 Kerberos 对 MySQL 服务器进行身份验证,前提是提供或可以获得适当的 Kerberos 票证。有关详细信息,请参阅第 6.4.1.8 节,“Kerberos 可插入身份验证”.

    • MySQL 现在支持角色,即特权的命名集合。可以创建和删除角色。角色可以被授予和撤销权限。可以向用户帐户授予和撤消角色。可以从授予该帐户的角色中选择帐户的活动适用角色,并且可以在该帐户的会话期间更改。有关详细信息,请参阅第 6.2.10 节,“使用角色”.

    • MySQL 现在合并了用户帐户类别的概念,系统用户和普通用户根据他们是否拥有SYSTEM_USER特权。看第 6.2.11 节,“帐户类别”.

    • 以前,除了某些模式之外,无法授予全局适用的权限。这现在是可能的,如果部分撤销系统变量已启用。看第 6.2.12 节,“使用部分撤销的权限限制”.

    • 授予声明有一个作为 *用户* [有角色]子句,指定有关用于语句执行的特权上下文的附加信息。这种语法在 SQL 级别是可见的,尽管它的主要目的是通过使这些限制出现在二进制日志中,在所有节点上实现由部分撤销施加的授予者权限限制的统一复制。看第 13.7.1.6 节,“GRANT 声明”.

    • MySQL 现在维护有关密码历史记录的信息,从而限制重复使用以前的密码。DBA 可以要求在一定次数的密码更改或一段时间内不要从以前的密码中选择新密码。可以在全局以及每个帐户的基础上建立密码重用策略。

      现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使 DBA 能够防止用户在不证明他们知道当前密码的情况下更改密码。可以在全球范围内以及在每个帐户的基础上建立密码验证策略。

      现在允许帐户具有双重密码,这使得分阶段密码更改可以在复杂的多服务器系统中无缝执行,而无需停机。

      MySQL 现在允许管理员配置用户帐户,以便由于密码错误导致的太多连续登录失败导致临时帐户锁定。所需的失败次数和锁定时间可根据帐户进行配置。

      这些新功能使 DBA 可以更全面地控制密码管理。有关详细信息,请参阅第 6.2.15 节,“密码管理”.

    • MySQL 现在支持 FIPS 模式,如果使用 OpenSSL 编译,并且 OpenSSL 库和 FIPS 对象模块在运行时可用。FIPS 模式对加密操作施加条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。看第 6.8 节,“FIPS 支持”.

    • 服务器用于新连接的 TLS 上下文现在可以在运行时重新配置。此功能可能很有用,例如,避免重新启动运行时间过长以至于其 SSL 证书已过期的 MySQL 服务器。看加密连接的服务器端运行时配置和监控.

    • OpenSSL 1.1.1 支持用于加密连接的 TLS v1.3 协议,如果服务器和客户端都使用 OpenSSL 1.1.1 或更高版本编译,则 MySQL 8.0.16 及更高版本也支持 TLS v1.3。看第 6.3.2 节,“加密连接 TLS 协议和密码”.

    • MySQL 现在将在命名管道上授予客户端的访问控制设置为在 Windows 上成功通信所需的最低限度。较新的 MySQL 客户端软件无需任何额外配置即可打开命名管道连接。如果旧的客户端软件不能立即升级,新的named_pipe_full_access_group系统变量可用于为 Windows 组提供打开命名管道连接所需的权限。完全访问组中的成员资格应受到限制且是临时的。

    • 以前,MySQL 用户帐户使用单一身份验证方法向服务器进行身份验证。从 MySQL 8.0.27 开始,MySQL 支持多因素身份验证 (MFA),这使得创建最多具有三种身份验证方法的帐户成为可能。MFA 支持需要进行以下更改:

      • 创建用户更改用户语法已扩展为允许指定多种身份验证方法。

      • 身份验证策略系统变量允许通过控制可以使用的因素数量以及每个因素允许的身份验证类型来建立 MFA 策略。这限制了与认证相关的条款如何创建用户更改用户可以使用语句。

      • 客户程序有新的--密码1,--密码2, 和--密码3用于指定多个密码的命令行选项。对于使用 C API 的应用程序,新的MYSQL_OPT_USER_PASSWORD选项mysql_options4() (opens new window)C API 函数启用相同的功能。

        此外,MySQL 企业版现在支持使用智能卡、安全密钥和生物识别阅读器等设备对 MySQL 服务器进行身份验证。这种身份验证方法基于快速身份在线 (FIDO) 标准,并使用一对插件,身份验证_fido在服务器端和authentication_fido_client在客户端。服务器端 FIDO 身份验证插件仅包含在 MySQL Enterprise Edition 发行版中。它不包含在 MySQL 社区发行版中。但是,客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

        多因素身份验证可以使用现有的 MySQL 身份验证方法、新的 FIDO 身份验证方法或两者的组合。有关详细信息,请参阅第 6.2.18 节,“多因素身份验证”, 和第 6.4.1.11 节,“FIDO 可插入身份验证”.

  • **资源管理。**MySQL 现在支持资源组的创建和管理,并允许将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。组属性启用对其资源的控制,以启用或限制组中线程的资源消耗。DBA 可以根据不同的工作负载修改这些属性。目前,CPU时间是一种可管理的资源,以“虚拟CPU”的概念表示,包括CPU内核、超线程、硬件线程等。服务器在启动时确定有多少虚拟 CPU 可用,具有适当权限的数据库管理员可以将这些 CPU 与资源组相关联并将线程分配给组。有关详细信息,请参阅第 5.1.16 节,“资源组”.

  • **表加密管理。**现在可以通过定义和强制加密默认值来全局管理表加密。这default_table_encryption变量为新创建的模式和通用表空间定义了加密默认值。模式的加密默认值也可以使用默认加密创建模式时的子句。默认情况下,表继承了创建它的模式或通用表空间的加密。加密默认值是通过启用table_encryption_privilege_check多变的。权限检查发生在创建或更改具有不同于default_table_encryption设置,或者在使用不同于默认模式加密的加密设置创建或更改表时。这TABLE_ENCRYPTION_ADMIN权限允许在以下情况下覆盖默认加密设置table_encryption_privilege_check已启用。有关详细信息,请参阅为模式和通用表空间定义加密默认值.

  • **InnoDB 增强功能。**这些InnoDB添加了增强功能:

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

      • 服务器重启不再取消AUTO_INCREMENT = N表选项。如果将自动增量计数器初始化为特定值,或者将自动增量计数器值更改为更大的值,则新值会在服务器重新启动时保持不变。

      • 服务器立即重启回滚操作不再导致重用分配给回​​滚事务的自动增量值。

      • 如果你修改一个自动递增将列值设置为大于当前最大自动增量值的值(在更新操作,例如),新值被持久化,随后插入操作从新的更大的值开始分配自动增量值。

        有关详细信息,请参阅第 15.6.1.6 节,“自动_InnoDB 中的增量处理”, 和InnoDB 自动_INCREMENT 计数器初始化.

    • 当遇到索引树损坏时,InnoDB将损坏标志写入重做日志,使损坏标志崩溃安全。InnoDB还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。康复期间,InnoDB在将内存表和索引对象标记为损坏之前,从两个位置读取损坏标志并合并结果。

    • InnoDB 内存缓存插件支持多个得到操作(一次获取多个键值对内存缓存查询)和范围查询。看第 15.20.4 节,“InnoDB memcached 多获取和范围查询支持”.

    • 一个新的动态变量,innodb_deadlock_detect, 可用于禁用死锁检测。在高并发系统上,当多个线程等待同一个锁时,死锁检测会导致速度变慢。有时,禁用死锁检测并依赖innodb_lock_wait_timeout发生死锁时事务回滚的设置。

    • 新的INFORMATION_SCHEMA.INNODB_CACHED_INDEXES表报告缓存在InnoDB每个索引的缓冲池。

    • InnoDB现在在共享临时表空间中创建临时表,ibtmp1.

    • InnoDB 表空间加密功能支持redo log和undo log数据的加密。看重做日志加密, 和撤消日志加密.

    • InnoDB支持现在等待跳过锁定选项选择...分享选择 ... 更新锁定读取语句。现在等待如果请求的行被另一个事务锁定,则使语句立即返回。跳过锁定从结果集中删除锁定的行。看使用 NOWAIT 和 SKIP LOCKED 锁定读取并发.

      选择...分享替换选择 ... 锁定共享模式, 但锁定分享模式仍然可用于向后兼容。语句是等价的。然而,更新分享支持现在等待,跳过锁定, 和的 *tbl_name*选项。看第 13.2.10 节,“SELECT 语句”.

      的 *tbl_name*将锁定查询应用于命名表。

    • 添加分区,删除分区,合并分区,重组分区, 和重建分区 更改表选项由本地分区就地 API 支持,并且可以与算法={复制|插入}条款。

      删除分区算法=就地删除存储在分区中的数据并删除分区。然而,删除分区算法=复制要么old_alter_table=开启重建分区表并尝试将数据从删除的分区移动到另一个具有兼容的分区分区...值定义。无法移动到另一个分区的数据将被删除。

    • InnoDB存储引擎现在使用 MySQL 数据字典而不是它自己的存储引擎特定的数据字典。有关数据字典的信息,请参阅第 14 章,MySQL 数据字典.

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

    • MySQL 8.0 中引入了以下撤消表空间更改:

      • 默认情况下,撤消日志现在驻留在初始化 MySQL 实例时创建的两个撤消表空间中。撤消日志不再在系统表空间中创建。

      • 从 MySQL 8.0.14 开始,可以在运行时在选定位置创建额外的撤消表空间,使用创建撤销表空间句法。

        CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
        

        撤消使用创建的表空间创建撤销表空间语法可以在运行时使用删除撤销表空间句法。

        DROP UNDO TABLESPACE tablespace_name;
        

        更改撤消表空间语法可用于将撤消表空间标记为活动或非活动。

        ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};
        

        一种状态显示表空间状态的列已添加到INFORMATION_SCHEMA.INNODB_TABLESPACES桌子。撤消表空间必须位于空的在它可以被删除之前的状态。

      • innodb_undo_log_truncate默认情况下启用变量。

      • innodb_rollback_segments变量定义每个撤消表空间的回滚段数。之前,innodb_rollback_segments指定 MySQL 实例的回滚段总数。此更改增加了可用于并发事务的回滚段的数量。更多的回滚段增加了并发事务为撤消日志使用单独的回滚段的可能性,从而减少了资源争用。

    • 修改了影响缓冲池预刷新和刷新行为的变量的默认值:

      • innodb_max_dirty_pages_pct_lwm现在默认值为 10。之前的默认值 0 禁用缓冲池预刷新。当缓冲池中脏页的百分比超过 10% 时,值 10 启用预刷新。启用预刷新可提高性能一致性。这

      • innodb_max_dirty_pages_pct默认值从 75 增加到 90。InnoDB尝试从缓冲池中刷新数据,以使脏页的百分比不超过此值。增加的默认值允许缓冲池中有更大百分比的脏页。默认

    • innodb_autoinc_lock_mode设置现在为 2(交错)。交错锁模式允许并行执行多行插入,从而提高了并发性和可伸缩性。新的innodb_autoinc_lock_mode默认设置反映了从基于语句的复制到基于行的复制作为 MySQL 5.7 中默认复制类型的变化。基于语句的复制需要连续的自动增量锁定模式(以前​​的默认值),以确保为给定的 SQL 语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制对SQL 语句的执行顺序。有关详细信息,请参阅InnoDB 自动_增量锁定模式.

      对于使用基于语句的复制的系统,新的innodb_autoinc_lock_mode默认设置可能会破坏依赖于顺序自动增量值的应用程序。要恢复以前的默认值,请设置innodb_autoinc_lock_mode为 1。

    • 支持重命名通用表空间ALTER TABLESPACE ...重命名为句法。

    • 新的innodb_dedicated_server默认情况下禁用的变量可用于InnoDB根据服务器上检测到的内存量自动配置以下选项:

    • 新的INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF视图提供空间、名称、路径、标志和空间类型数据InnoDB表空间。

    • zlib 库 (opens new window)与 MySQL 捆绑的版本从版本 1.2.3 提升到版本 1.2.11。MySQL 在 zlib 库的帮助下实现压缩。

      如果你使用InnoDB压缩表,见第 2.11.4 节,“MySQL 8.0 中的更改”对于相关的升级影响。

    • 序列化字典信息 (SDI) 存在于所有InnoDB除了全局临时表空间和撤消表空间文件之外的表空间文件。SDI 是表和表空间对象的序列化元数据。SDI 数据的存在提供了元数据冗余。例如,如果数据字典变得不可用,则可以从表空间文件中提取字典对象元数据。SDI 提取是使用ibd2sdi工具。SDI 数据存储在JSON格式。

      在表空间文件中包含 SDI 数据会增加表空间文件的大小。SDI 记录需要一个索引页,默认大小为 16KB。但是,SDI 数据在存储时会被压缩以减少存储空间。

    • InnoDB存储引擎现在支持原子 DDL,它确保 DDL 操作要么完全提交要么回滚,即使服务器在操作期间停止。有关详细信息,请参阅第 13.1.1 节,“原子数据定义语句支持”.

    • 当服务器离线时,可以使用innodb_directories选项。有关详细信息,请参阅第 15.6.3.6 节,“在服务器脱机时移动表空间文件”.

    • 实施了以下重做日志优化:

      • 用户线程现在可以在不同步写入的情况下并发写入日志缓冲区。

      • 用户线程现在可以以宽松的顺序将脏页添加到刷新列表中。

      • 一个专用的日志线程现在负责将日志缓冲区写入系统缓冲区、将系统缓冲区刷新到磁盘、通知用户线程有关写入和刷新的重做、维护宽松刷新列表顺序所需的延迟以及写入检查点。

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

      • innodb_log_buffer_size变量现在是动态的,它允许在服务器运行时调整日志缓冲区的大小。

        有关详细信息,请参阅第 8.5.4 节,“优化 InnoDB 重做日志”.

    • 从 MySQL 8.0.12 开始,对大对象 (LOB) 数据的小更新支持撤消日志记录,这提高了 100 字节或更小的 LOB 更新的性能。以前,LOB 更新的大小至少为一个 LOB 页,这对于可能只修改几个字节的更新来说不是最佳的。此增强功能基于 MySQL 8.0.4 中添加的对 LOB 数据的部分更新的支持。

    • 从 MySQL 8.0.12 开始,算法=即时支持以下更改表操作:

      • 添加一列。此功能也称为“即时添加列”。限制适用。看第 15.12.1 节,“在线 DDL 操作”.

      • 添加或删除虚拟列。

      • 添加或删除列默认值。

      • 修改定义枚举要么柱子。

      • 更改索引类型。

      • 重命名表。

        支持的操作算法=即时只修改数据字典中的元数据。表上没有元数据锁,表数据不受影响,操作是即时的。如果没有明确指定,算法=即时默认情况下由支持它的操作使用。如果算法=即时已指定但不受支持,则操作会立即失败并出现错误。

        有关支持的操作的更多信息算法=即时, 看第 15.12.1 节,“在线 DDL 操作”.

    • 从 MySQL 8.0.13 开始,临时表存储引擎支持存储二进制大对象 (BLOB) 类型的列。此增强功能提高了使用包含 BLOB 数据的临时表的查询的性能。以前,包含 BLOB 数据的临时表存储在由定义的磁盘存储引擎中internal_tmp_disk_storage_engine.有关详细信息,请参阅第 8.4.4 节,“MySQL 中的内部临时表使用”.

    • 从 MySQL 8.0.13 开始,InnoDB静态数据加密功能支持通用表空间。以前,只能加密 file-per-table 表空间。为了支持通用表空间的加密,创建表空间改变表空间语法被扩展为包括加密条款。

      INFORMATION_SCHEMA.INNODB_TABLESPACES表现在包括一个加密指示表空间是否加密的列。

      stage/innodb/alter 表空间(加密)添加了性能模式阶段工具以允许监视一般表空间加密操作。

    • 禁用innodb_buffer_pool_in_core_file变量通过排除减少核心文件的大小InnoDB缓冲池页面。要使用这个变量,核心文件变量必须启用并且操作系统必须支持MADV_DONTDUMP非 POSIX 扩展至疯狂的(),在 Linux 3.4 及更高版本中受支持。有关详细信息,请参阅第 15.8.3.7 节,“从核心文件中排除缓冲池页面”.

    • 从 MySQL 8.0.13 开始,用户创建的临时表和优化器创建的内部临时表存储在会话临时表空间中,这些临时表空间从临时表空间池中分配给会话。当会话断开连接时,其临时表空间将被截断并释放回池中。在以前的版本中,临时表是在全局临时表空间 (ibtmp1),在删除临时表后没有将磁盘空间返回给操作系统。

      innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是#innodb_temp数据目录中的目录。

      INNODB_SESSION_TEMP_TABLESPACEStable 提供有关会话临时表空间的元数据。

      全局临时表空间 (ibtmp1) 现在存储对用户创建的临时表所做的更改的回滚段。

    • 从 MySQL 8.0.14 开始,InnoDB支持并行聚集索引读取,可以提高检查表表现。此功能不适用于二级索引扫描。这innodb_parallel_read_threads会话变量必须设置为大于1的值,才能进行并行聚集索引读取。默认值为4。用于执行并行聚集索引读取的实际线程数由innodb_并行_读取_线程设置或要扫描的索引子树数,以较小者为准。

    • 从2014年8月0日起innodb_专用_服务器变量,则根据自动配置的缓冲池大小配置日志文件的大小和数量。以前,日志文件大小是根据服务器上检测到的内存量配置的,日志文件的数量不是自动配置的。

    • 截至2014年8月0日添加数据文件合同条款创建表空间语句是可选的,它允许用户不使用文件创建表空间的特权。A.创建表空间语句执行时没有添加数据文件子句隐式创建具有唯一文件名的表空间数据文件。

    • 默认情况下,当可诱惑存储引擎占用的内存量超过诱人的_max_ram变量时,诱人的存储引擎开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始,这种行为由诱人的_使用_mmap变量禁用诱人的_使用_mmap使诱人的存储引擎使用InnoDB磁盘上的内部临时表,而不是内存映射文件作为其溢出机制。有关更多信息,请参阅内部临时表存储引擎.

    • 从MySQL 8.0.16开始InnoDB静态数据加密功能支持对mysql系统表空间。这个mysql系统表空间包含mysql系统数据库和MySQL数据字典表。有关更多信息,请参阅第15.13节,“InnoDB静态数据加密”.

    • 这个innodb\u旋转\u等待\u暂停\u倍增MySQL 8.0.16中引入的变量可以更好地控制线程等待获取互斥锁或rw锁时发生的自旋锁轮询延迟的持续时间。延迟可以进行更精细的调整,以考虑不同处理器架构上暂停指令持续时间的差异。有关更多信息,请参阅第15.8.8节,“配置旋转锁轮询”.

    • InnoDB在MySQL 8.0.17中,通过更好地利用读取线程、减少并行扫描期间发生的预取活动的读取线程I/O,以及支持分区的并行扫描,大型数据集的并行读取线程性能得到了提高。

      并行读取线程功能由innodb_并行_读取_线程变量最大设置现在是256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。

    • 这个innodb_空闲_刷新_pctMySQL 8.0.18中引入的变量允许在空闲期间限制页面刷新,这有助于延长固态存储设备的使用寿命。看见在空闲期间限制缓冲区刷新.

    • 有效采样InnoDBMySQL 8.0.19支持用于生成直方图统计的数据。看见直方图统计分析.

    • 从MySQL 8.0.20开始,doublewrite缓冲区存储区域位于doublewrite文件中。在以前的版本中,存储区域位于系统表空间中。将存储区域移出系统表空间可以减少写入延迟,提高吞吐量,并在放置双写缓冲页方面提供灵活性。为高级双写缓冲区配置引入了以下系统变量:

    • MySQL 8.0.20中改进了竞争感知事务调度(CAT)算法,该算法对等待锁定的事务进行优先级排序。事务调度权重计算现在完全由单独的线程执行,这提高了计算性能和准确性。

      先进先出(FIFO)算法也被用于事务调度,该算法被删除。FIFO算法通过对CATS算法的增强而变得多余。以前由FIFO算法执行的事务调度现在由CATS算法执行。

      A.TRX_时间表_重量列被添加到信息模式。INNODB_TRX表,它允许查询由CATS算法分配的事务调度权重。

      下面INNODB_度量为监视代码级事务调度事件添加了计数器:

      • 锁定恢复释放尝试

        尝试释放记录锁的次数。

      • 锁定记录授予尝试

        尝试授予记录锁的次数。

      • 锁定\u时间表\u刷新

        分析等待图以更新事务调度权重的次数。

        有关更多信息,请参阅第15.7.6节“事务调度”.

    • 从MySQL 8.0.21开始,为了提高需要访问表和行资源的锁队列的操作的并发性,锁系统互斥锁(锁定系统->互斥)在中被碎片锁取代,锁队列被分组到表和页中锁定队列碎片,每个碎片由专用互斥锁保护。以前,单锁系统互斥体保护所有锁队列,这是高并发系统上的一个争用点。新的分片实现允许对锁队列进行更细粒度的访问。

      锁系统互斥锁(锁定系统->互斥)替换为以下分片闩锁:

      • 全球闩锁(锁定系统->闩锁。全局锁定)由64个读写锁对象组成(rw_lock_t).访问单个锁队列需要共享全局闩锁和锁队列碎片上的闩锁。需要访问所有锁队列的操作采用独占全局锁存器,该锁存器锁存所有表和页锁队列碎片。

      • 桌子碎片闩锁(锁定系统->闩锁。桌子碎片。互斥器),实现为512个互斥体的数组,每个互斥体专用于512个表锁队列碎片中的一个。

      • 页碎片闩锁(锁定系统->闩锁。页面碎片。互斥器),实现为512个互斥体的数组,每个互斥体专用于512个页面锁队列碎片中的一个。

        性能模式wait/synch/mutex/innodb/lock_mutex用于监控单锁系统互斥锁的仪器已被用于监控新的全局、表碎片和页面碎片闩锁的仪器所取代:

      • wait/synch/sxlock/innodb/lock_sys_global_rw_lock

      • wait/synch/mutex/innodb/lock_sys_table_mutex

      • wait/synch/mutex/innodb/lock_sys_page_mutex

    • 从MySQL 8.0.21开始,使用数据目录子句仅限于已知的目录InnoDB。此更改允许数据库管理员控制表空间数据文件的创建位置,并确保在恢复期间可以找到这些数据文件。

      常规和每表文件表空间数据文件(.传染性法氏囊病无法再在撤消表空间目录中创建文件)(innodb_undo_目录)除非大家都知道InnoDB.

      已知目录是由数据目录, innodb_数据_主页_目录innodb_目录变量。

      截断InnoDB驻留在每个表表空间的文件中的表会删除现有表空间并创建一个新表空间。从MySQL 8.0.21开始,InnoDB在默认位置创建新表空间,并在当前表空间目录未知时向错误日志写入警告。拥有截断表在当前位置创建表空间,将目录添加到innodb_目录运行前设置截断表.

    • 从MySQL 8.0.21开始,可以使用ALTER实例{ENABLE | DISABLE}INNODB REDO_LOG语法。此功能用于将数据加载到新的MySQL实例中。禁用重做日志有助于避免重做日志写入,从而加快数据加载速度。

      新的INNODB_重做_日志_启用特权允许启用和禁用重做日志记录。

      新的Innodb_重做_日志_已启用状态变量允许监视重做日志记录状态。

      看见禁用重做日志记录.

    • 创业时,InnoDB如果表空间文件已移动到其他位置,则根据数据字典中存储的表空间文件路径验证已知表空间文件的路径。新的innodb_验证_表空间_路径MySQL 8.0.21中引入的变量允许禁用表空间路径验证。此功能适用于不移动表空间文件的环境。禁用表空间路径验证可以缩短具有大量表空间文件的系统的启动时间。

      有关更多信息,请参阅第15.6.3.7节,“禁用表空间路径验证”.

    • 从MySQL 8.0.21开始,在支持原子DDL的存储引擎上创建表格。。。选择当使用基于行的复制时,语句作为一个事务记录在二进制日志中。以前,它被记录为两个事务,一个用于创建表,另一个用于插入数据。有了这个变化,创建表格。。。选择语句现在对于基于行的复制是安全的,并且允许与基于GTID的复制一起使用。有关更多信息,请参阅第13.1.1节,“原子数据定义语句支持”.

    • 在繁忙系统上截断撤消表空间可能会影响性能,因为相关的刷新操作会从缓冲池中删除旧的撤消表空间页,并将新撤消表空间的初始页刷新到磁盘。为了解决这个问题,从MySQL 8.0.21开始删除刷新操作。

      旧的undo表空间页面在最近使用最少时被被动释放,或者在下一个完整检查点被删除。新undo表空间的初始页面现在被重做日志记录,而不是在truncate操作期间刷新到磁盘,这也提高了undo表空间truncate操作的持久性。

      为了防止由于撤消表空间截断操作过多而导致的潜在问题,检查点之间相同撤消表空间上的截断操作现在限制为64个。如果超过该限制,撤消表空间仍然可以处于非活动状态,但直到下一个检查点之后才会被截断。

      INNODB_度量已删除与已失效的撤消截断刷新操作关联的计数器。移除的计数器包括:撤消\u截断\u扫描\u计数, 撤消_截断_扫描_使用, 撤消\u截断\u刷新\u计数撤消\u截断\u刷新\u使用.

      看见第15.6.3.4节,“撤消表空间”.

    • 从MySQL 8.0.22开始,新的innodb_扩展_和_初始化变量允许如何配置InnoDB在Linux上为每个表和常规表空间分配文件空间。默认情况下,当操作需要表空间中的额外空间时,InnoDB将页分配给表空间,并将空值物理写入这些页。如果频繁分配新页面,此行为会影响性能。你可以禁用innodb_扩展_和_初始化在Linux系统上,避免向新分配的表空间页物理写入null。什么时候innodb_扩展_和_初始化已禁用,则使用posix_fallocate()调用,它在不实际写入空值的情况下保留空间。

      A.posix_fallocate()操作不是原子的,这使得在为表空间文件分配空间和更新文件元数据之间可能发生故障。这种故障会使新分配的页面处于未初始化状态,从而导致在InnoDB试图访问这些页面。为了防止这种情况发生,InnoDB在分配新表空间页之前写入重做日志记录。如果页面分配操作被中断,则在恢复期间将从重做日志记录中重播该操作。

    • 从MySQL 8.0.23开始,InnoDB支持对属于加密表空间的doublewrite文件页进行加密。使用相关表空间的加密密钥对页面进行加密。有关更多信息,请参阅第15.13节,“InnoDB静态数据加密”.

    • 这个诱人的_max_mmapMySQL 8.0.23中引入的变量定义了在开始在磁盘上存储内部临时表数据之前,可诱惑存储引擎允许从内存映射(MMAP)文件分配的最大内存量。设置为0将禁用MMAP文件的分配。有关更多信息,请参阅第8.4.4节,“MySQL中的内部临时表使用”.

    • 这个自动扩展大小选项在MySQL 8.0.23中引入,定义了InnoDB当表空间满时扩展表空间的大小,从而可以以更大的增量扩展表空间大小。这个自动扩展大小选项受创建表格, 改变桌子, 创建表空间改变表空间声明。有关更多信息,请参阅第15.6.3.9节,“表空间自动扩展”_“尺寸配置”.

      自动扩展大小大小列已添加到信息模式。INNODB_表空间桌子

    • 这个innodb_段_保留系数_MySQL 8.0.26中引入的系统变量允许配置保留为空页的表空间文件段页的百分比。有关更多信息,请参阅配置保留文件段页面的百分比.

    • 在支持fdatasync()系统调用innodb_使用_fdatasyncMySQL 8.0.26中引入的变量允许使用fdatasync()而不是fsync()用于操作系统刷新。一fdatasync()除非后续数据检索需要,否则系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。

    • 从MySQL 8.0.28开始tmp_表_尺寸变量定义由可诱惑存储引擎创建的任何单个内存内部临时表的最大大小。适当的大小限制可以防止单个查询消耗过多的全局资源。看见内部临时表存储引擎.

    • 在MySQL 8.0.28中innodb_打开_文件变量,它定义了文件的数量InnoDB可以一次打开,可以在运行时使用选择innodb\u设置\u打开\u文件\u限制(*N*)陈述该语句执行设置新限制的存储过程。

      防止非LRU管理的文件占用整个innodb_打开_文件限制,非LRU管理的文件限制为innodb_打开_文件限制,即保留10%的innodb_打开_文件限制LRU管理的文件。

      这个innodb_打开_文件limit包括临时表空间文件,这些文件以前未计入限制。

    • 从MySQL 8.0.28开始,InnoDB支持改变桌子。。。重命名列使用算法=即时.

      支持算法=即时仅修改数据字典中的元数据。在操作的准备和执行阶段,表上没有独占的元数据锁,并且表数据不受影响,这使得操作是即时的。如果没有明确规定,算法=即时默认情况下由支持它的DDL操作使用。

      有关此操作和其他支持的DDL操作的更多信息算法=即时看见第15.12.1节,“在线DDL操作”.

  • **字符集支持。**默认字符集已从拉丁语1utf8mb4这个utf8mb4字符集有几个新的排序规则,包括utf8mb4_ja_0900_as_cs,这是MySQL中第一个针对Unicode的日语特定排序规则。有关更多信息,请参阅第10.10.1节,“Unicode字符集”.

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

    • 补充道->>(内联路径)运算符,相当于调用JSON_UNQUOTE()关于JSON_EXTRACT().

      这是对列路径操作符的改进->在MySQL 5.7中引入;col->>“$.path”相当于JSON_UNQUOTE(col->“$.path”)。内联路径运算符可以在任何可以使用的地方使用JSON_UNQUOTE(JSON_EXTRACT())这样的选择列列表,哪里条款,以及订购人分组条款。有关更多信息,请参阅操作员的说明,以及JSON路径语法.

    • 添加了两个JSON聚合函数JSON_ARRAYAGG()JSON_OBJECTAGG(). JSON_ARRAYAGG()将列或表达式作为其参数,并将结果聚合为单个JSON大堆表达式可以计算为任何MySQL数据类型;这不一定是一个问题JSON价值JSON_OBJECTAGG()获取两列或表达式,并将其解释为键和值;它将结果作为单个字符串返回JSON对象有关更多信息和示例,请参阅第12.20节“聚合功能”.

    • 添加了JSON实用程序函数JSON_PRETTY(),它输出一个现有的JSON易于阅读的格式;每个JSON对象成员或数组值打印在单独的一行上,子对象或数组相对于其父对象有两个空格。

      该函数还可以处理可以解析为JSON值的字符串。

      有关更多详细信息和示例,请参阅第12.18.8节,“JSON实用程序函数”.

    • 分拣时JSON使用订购人,每个值现在由排序键的可变长度部分表示,而不是固定1K大小的一部分。在许多情况下,这可以减少过度使用。例如,标量国际的甚至比金值实际上只需要很少的字节,所以这个空间的剩余部分(高达90%或更多)被填充占据。此更改对性能有以下好处:

      • 排序缓冲区空间现在得到了更有效的利用,因此文件排序不需要像固定长度的排序键那样提前或频繁地刷新到磁盘上。这意味着可以在内存中对更多数据进行排序,从而避免不必要的磁盘访问。

      • 较短的键可以比较长的键更快地进行比较,从而显著提高性能。对于完全在内存中执行的排序,以及需要向磁盘写入和从磁盘读取的排序,都是如此。

    • 在MySQL 8.0.2中增加了对JSON列值,这比完全删除现有的JSON值并在其位置写入新值更有效,就像之前更新任何JSON值时所做的那样JSON柱要应用此优化,必须使用JSON_SET(), JSON_REPLACE()JSON_REMOVE()。无法将新元素添加到正在更新的JSON文档中;文档中的值不能比更新前占用更多空间。看见JSON值的部分更新,以详细讨论这些要求。

      JSON文档的部分更新可以写入二进制日志,比记录完整的JSON文档占用更少的空间。在使用基于语句的复制时,部分更新总是这样记录的。要使用基于行的复制,必须首先设置binlog_row_value_options=PARTIAL_JSON; 有关详细信息,请参阅此变量的说明。

    • 添加了JSON实用程序函数JSON_存储_大小()JSON_存储_免费(). JSON_存储_大小()返回在任何部分更新之前用于JSON文档二进制表示的存储空间(以字节为单位)(请参阅上一项)。JSON_存储_免费()显示类型为的表列中剩余的空间量JSON在使用JSON_SET()JSON_REPLACE(); 如果新值的二进制表示形式小于前一个值的二进制表示形式,则该值大于零。

      每个函数还接受JSON文档的有效字符串表示形式。为了这样的价值,JSON_存储_大小()返回其二进制表示形式转换为JSON文档后使用的空间。对于包含JSON文档字符串表示形式的变量,JSON_存储_免费()返回零。如果其(非null)参数不能被解析为有效的JSON文档,则任一函数都会产生错误,并且无效的如果论点是正确的无效的.

      有关更多信息和示例,请参阅第12.18.8节,“JSON实用程序函数”.

      JSON_存储_大小()JSON_存储_免费()在MySQL 8.0.2中实现。

    • 在MySQL 8.0.2中增加了对以下范围的支持:美元[1至5]在XPath表达式中。在此版本中还添加了对最后的关键字和相对地址,例如$[最后]始终选择数组中最后一个(编号最高)元素,然后$[last-1]倒数第二个元素。最后的使用它的表达式也可以包含在范围定义中。例如$[last-2至last-1]返回最后两个元素,但一个元素来自数组。看见搜索和修改JSON值,以获取更多信息和示例。

    • 添加了一个JSON合并函数,以符合RFC 7396 (opens new window). JSON_MERGE_PATCH(),用于2个JSON对象时,将它们合并为一个JSON对象,该对象的成员包括以下集合的并集:

      • 第一个对象的每个成员,第二个对象中没有具有相同密钥的成员。

      • 第二个对象的每个成员,在第一个对象中没有成员具有相同的键,并且其值不是JSON无效的字面意义的

      • 每个成员都有一个键,该键存在于两个对象中,并且在第二个对象中的值不是JSON无效的字面意义的

        作为这项工作的一部分JSON_MERGE()函数已重命名JSON_MERGE_PRESERVE(). JSON_MERGE()继续被识别为的别名JSON_MERGE_PRESERVE()在MySQL 8.0中,但现在已被弃用,并可能在MySQL的未来版本中被删除。

        有关更多信息和示例,请参阅第12.18.4节,“修改JSON值的函数”.

    • 实现了重复密钥的“最后一次重复密钥赢”规范化,与RFC 7159 (opens new window)以及大多数JavaScript解析器。这里显示了这种行为的一个示例,其中只有最右边的成员拥有密钥十、被保留下来:

      mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]',
           >                     'x', '"abc"', 'x', '100') AS Result;
      +------------------------------------+
      | Result                             |
      +------------------------------------+
      | {"x": "100", "y": "[true, false]"} |
      +------------------------------------+
      1 row in set (0.00 sec)
      

      插入MySQL的值JSON列也以这种方式规范化,如本例所示:

      mysql> CREATE TABLE t1 (c1 JSON);
      
      mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}');
      
      mysql> SELECT c1 FROM t1;
      +------------------+
      | c1               |
      +------------------+
      | {"x": [3, 5, 7]} |
      +------------------+
      

      这与之前版本的MySQL不兼容,MySQL在这种情况下使用了“第一次重复密钥赢”算法。

      看见JSON值的规范化、合并和自动包装,以获取更多信息和示例。

    • 补充道JSON_表()MySQL 8.0.4中的函数。此函数接受JSON数据,并将其作为具有指定列的关系表返回。

      此函数具有以下语法:JSON_表(*expr*, *路径*纵队*列列表*)[作为]*别名*)哪里*expr是一个返回JSON数据的表达式,路径是应用于源的JSON路径,以及列列表*是列定义的列表。此处显示了一个示例:

      mysql> SELECT *
          -> FROM
          ->   JSON_TABLE(
          ->     '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]',
          ->     "$[*]" COLUMNS(
          ->       rowid FOR ORDINALITY,
          ->
          ->       xa INT EXISTS PATH "$.a",
          ->       xb INT EXISTS PATH "$.b",
          ->
          ->       sa VARCHAR(100) PATH "$.a",
          ->       sb VARCHAR(100) PATH "$.b",
          ->
          ->       ja JSON PATH "$.a",
          ->       jb JSON PATH "$.b"
          ->     )
          ->   ) AS  jt1;
      +-------+------+------+------+------+------+--------+
      | rowid | xa   | xb   | sa   | sb   | ja   | jb     |
      +-------+------+------+------+------+------+--------+
      |     1 |    1 |    1 | 3    | 0    | 3    | "0"    |
      |     2 |    1 |    1 | 3    | 1    | "3"  | "1"    |
      |     3 |    1 |    1 | 2    | 1    | 2    | 1      |
      |     4 |    1 |    0 | 0    | NULL | 0    | NULL   |
      |     5 |    0 |    1 | NULL | NULL | NULL | [1, 2] |
      +-------+------+------+------+------+------+--------+
      

      JSON源表达式可以是生成有效JSON文档的任何表达式,包括JSON文本、表列或返回JSON的函数调用,例如JSON_摘录(t1,数据,'$.post.comments')。有关更多信息,请参阅第12.18.6节,“JSON表函数”.

  • **数据类型支持。**MySQL现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为斑点, 文本, 几何学JSON数据类型,以前根本无法为其指定默认值。有关详细信息,请参阅第11.6节,“数据类型默认值”.

  • **优化器。**添加了以下优化器增强功能:

    • MySQL现在支持不可见索引。优化器根本不使用不可见索引,但通常会维护它。默认情况下,索引是可见的。不可见索引可以测试删除索引对查询性能的影响,而无需进行破坏性的更改,如果需要索引,则必须撤消这些更改。看见第8.3.12节,“无形指数”.

    • MySQL现在支持降序索引:描述在索引中,定义不再被忽略,而是导致按降序存储键值。以前,索引可以按相反的顺序扫描,但性能会受到影响。降序索引可以按正向顺序扫描,这样效率更高。当最有效的扫描顺序混合了某些列的升序和其他列的降序时,降序索引还使优化器可以使用多个列索引。看见第8.3.13节,“递减指数”.

    • MySQL现在支持创建索引表达式值而不是列值的函数索引键部分。功能关键部件支持对无法以其他方式索引的值进行索引,例如JSON价值观有关详细信息,请参阅第13.1.15节,“创建索引语句”.

    • 在MySQL 8.0.14及更高版本中哪里常量文字表达式产生的条件将在准备过程中删除,而不是稍后在优化过程中删除。在该过程的早期删除该条件,可以简化查询的联接,外部联接具有简单的条件,例如:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1
      

      优化器现在在准备过程中看到0=1总是假的,这使得或0=1冗余,并将其删除,留下以下内容:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2
      

      现在,优化器可以将查询重写为内部联接,如下所示:

      SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2
      

      有关更多信息,请参阅第8.2.1.9节,“外部连接优化”.

    • 在MySQL 8.0.16及更高版本中,MySQL可以在优化时使用常量折叠来处理列与常量值之间的比较,其中常量超出范围或位于与列类型相关的范围边界上,而不是在执行时对每一行进行比较。例如,给定一张表t用一个TINYINT未签名c,优化器可以重写以下条件:其中c<256其中1(并完全优化条件),或其中c>=255其中c=255.

      看见第8.2.1.14节,“恒定折叠优化”,以获取更多信息。

    • 从MySQL 8.0.16开始,使用在里面子查询现在可以应用于存在子查询也是如此。此外,优化器现在在哪里附加到子查询的条件,以便可以类似于中的表达式来处理它们在里面子查询;这两种情况都适用存在在里面子查询。

      有关更多信息,请参阅第8.2.2.1节,“使用半连接转换优化IN和EXISTS子查询谓词”.

    • 从MySQL 8.0.17开始,服务器会重写任何不完整的SQL谓词(即具有在哪里*价值*,其中*价值*是列名或常量表达式,内部未使用比较运算符)在哪里*价值* <> 0在上下文化阶段,查询解析器、查询优化器和查询执行器只需要使用完整的谓词。

      这种变化的一个明显效果是,对于布尔值,解释输出现在显示符合事实的错误的而不是1.0.

      此更改的另一个影响是,在SQL布尔上下文中计算JSON值时,会与JSON整数0进行隐式比较。考虑创建和填充的表,如下面所示:

      mysql> CREATE TABLE test (id INT, col JSON);
      
      mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');
      

      之前,服务器试图转换提取的符合事实的错误的在SQL布尔值上下文中比较时,将值设置为SQL布尔值,如下使用这是真的:

      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+
      

      在MySQL 8.0.17及更高版本中,提取值与JSON整数0的隐式比较会导致不同的结果:

      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+----------------+--------------+
      | id   | col            | col->"$.val" |
      +------+----------------+--------------+
      |    1 | {"val": true}  | true         |
      |    2 | {"val": false} | false        |
      +------+----------------+--------------+
      

      从MySQL 8.0.21开始,您可以使用JSON_值()在执行测试之前,根据提取的值执行类型转换,如下所示:

      mysql> SELECT id, col, col->"$.val" FROM test
          ->     WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+
      

      同样从MySQL 8.0.21开始,服务器提供警告,在SQL布尔上下文中评估JSON值,并与JSON整数0进行隐式比较;如果这不是您想要的,请考虑用JSON将JSON转换为SQL数值类型。_以这种方式比较SQL布尔上下文中提取的值时返回的值。

    • 在MySQL 8.0.17及更高版本中哪里有条件不在(*子查询*)不存在(*子查询*)在内部转换为反连接。(反联接返回表中的所有行,该表中没有与联接条件匹配的行。)这将删除子查询,因为子查询的表现在是在顶层处理的,因此子查询可以更快地执行查询。

      这类似于并重用现有的是空的 (不存在)优化外部连接;看见解释额外信息.

    • 从MySQL 8.0.21开始,一个表使现代化删去语句现在在许多情况下可以使用半连接转换或子查询具体化。这适用于以下表格的陈述:

      • 更新t1集合t1。a=*价值*这里是t1。a IN(从t2中选择t2.a)

      • 从t1中删除,其中t1。a IN(从t2中选择t2.a)

        这可以在一张桌子上完成使现代化删去符合下列条件:

      • 这个使现代化删去语句使用具有[不]在[不]存在谓语

      • 这份声明没有任何意义订购人子句,并且没有限度条款

        (多表版本的使现代化删去不支持订购人限度.)

      • 目标表不支持先读后写删除(仅适用于NDB表)。

      • 基于子查询中包含的任何提示和优化器_开关.

        当半联接优化用于符合条件的单个表时删去使现代化,这在优化器跟踪中可见:对于多表语句加入优化对象,而对于单个表语句则没有。转换也可以在的输出中看到解释格式=树解释分析; 单表语句显示<迭代器执行器不可执行>,而多表语句则报告完整的计划。

        Alo从MySQL 8.0.21开始,多表支持半一致读取使现代化使用InnoDB表,用于低于可重复读取.

    • **提高了哈希连接性能。**MySQL 8.0.23重新实现了用于哈希连接的哈希表,从而在哈希连接性能方面取得了一些改进。这项工作包括修复一个问题(Bug#31516149,Bug#99933),其中只有大约2/3的内存分配给联接缓冲区(加入缓冲区大小)实际上可以被散列连接使用。

      新的哈希表通常比旧的哈希表更快,并且在对齐、键/值以及存在许多相等键的情况下使用更少的内存。此外,当哈希表的大小增加时,服务器现在可以释放旧内存。

  • **常见的表表达式。**MySQL现在支持常用的表表达式,包括非递归和递归。公共表表达式允许使用命名的临时结果集,通过允许具有前面的条款选择声明和某些其他声明。有关更多信息,请参阅第13.2.15节,“带(通用表格表达式)”.

    从MySQL 8.0.19开始,递归选择递归公共表表达式(CTE)的一部分支持限度条款限度具有抵消也支持。看见递归公共表表达式,以获取更多信息。

  • **窗口功能。**MySQL现在支持窗口函数,对于查询中的每一行,使用与该行相关的行执行计算。这些功能包括秩(), 滞后()安提尔().此外,现有的几个聚合函数现在可以用作窗口函数(例如,SUM()平均值())。有关更多信息,请参阅第12.21节“窗口功能”.

  • **横向派生表。**现在,派生表前面可能会有侧面的关键字来指定允许在同一个表中引用(依赖)前面表的列从…起条款横向派生表使某些SQL操作成为可能,这些操作无法用非横向派生表完成,或者需要效率较低的变通方法。看见第13.2.11.9节,“横向衍生表格”.

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

  • **正则表达式支持。**之前,MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符(REGEXP, ).正则表达式支持已使用国际Unicode组件(ICU)重新实现,该组件提供完整的Unicode支持,并且是多字节安全的。这个REGEXP_LIKE()函数以REGEXP运算符,现在是该函数的同义词。此外REGEXP_INSTR(), REGEXP_REPLACE()REGEXP_SUBSTR()函数分别用于查找匹配位置和执行子字符串替换和提取。这个regexp_stack_limitregexp_时间限制系统变量通过匹配引擎控制资源消耗。有关更多信息,请参阅第12.8.2节“正则表达式”。有关使用正则表达式的应用程序可能受到实现更改影响的方式的信息,请参阅正则表达式兼容性注意事项.

  • **内部临时表。**那个诱人的存储引擎取代了记忆力存储引擎作为内存内部临时表的默认引擎。这个诱人的存储引擎为用户提供高效的存储瓦尔查尔VARBINARY柱。这个内部存储引擎会话变量定义内存内部临时表的存储引擎。允许值为诱人的(默认)和记忆力这个诱人的_max_ram变量定义了诱人的存储引擎可以在数据存储到磁盘之前使用。

  • **登录中。**错误日志被重写为使用MySQL组件体系结构。传统的错误记录是使用内置组件实现的,而使用系统日志的记录是作为可加载组件实现的。此外,还提供了可加载的JSON日志编写器。要控制要启用的日志组件,请使用日志错误服务系统变量。有关更多信息,请参阅第5.4.2节“错误日志”.

  • **备用锁。**一种新型的备份锁允许在在线备份期间使用DML,同时防止可能导致快照不一致的操作。新的备份锁受锁定备份实例解锁实例语法。这个备份管理使用这些语句需要特权。

  • **复制。**对MySQL复制进行了以下增强:

    • MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制记录,在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过设置新的binlog_行_值_选项系统变量为部分_JSON。有关更多信息,请参阅JSON值的部分更新,以及binlog_行_值_选项.
  • **连接管理。**MySQL服务器现在允许专门为管理连接配置TCP/IP端口。这提供了一种替代单一管理连接的方法,该方法允许在用于普通连接的网络接口上使用,即使在max_连接连接已经建立。看见第5.1.12.1节“连接接口”.

    MySQL现在提供了对压缩使用的更多控制,以最小化通过连接发送到服务器的字节数。以前,给定的连接要么未压缩,要么使用兹利布压缩算法。现在,也可以使用zstd算法,并为zstd连接。允许的压缩算法可以在服务器端配置,也可以在连接发起端配置,以通过客户端程序和参与源/副本复制或组复制的服务器进行连接。有关更多信息,请参阅第4.2.8节,“连接压缩控制”.

  • 配置MySQL中主机名的最大允许长度已从之前的60个字符提高到255个ASCII字符。例如,这适用于数据字典中与主机名相关的列,mysql系统模式,性能模式,信息模式系统图式;这个主播价值观将主机更改为陈述这个主办列在显示进程列表语句输出;帐户名中的主机名(例如用于帐户管理报表和定义者属性);以及与主机名相关的命令选项和系统变量。

    注意事项:

    • 允许的主机名长度的增加可能会影响在主机名列上具有索引的表。例如,中的表mysql索引主机名的系统架构现在有一个显式行格式属性动态以适应更长的索引值。

    • 某些文件名值的配置设置可能基于服务器主机名构建。允许的值受基础操作系统的约束,该操作系统可能不允许文件名的长度足以包含255个字符的主机名。这会影响到常规日志文件, 日志错误, pid_文件, 中继日志慢速查询日志文件系统变量和相应的选项。如果基于主机名的值对于操作系统来说太长,则必须提供显式的较短值。

    • 虽然服务器现在支持255个字符的主机名,但使用--ssl模式=验证身份选项受OpenSSL支持的最大主机名长度限制。主机名匹配与SSL证书的两个字段有关,它们的最大长度如下:公共名称:最大长度64;受试者备选名称:RFC#1034规定的最大长度。

  • **插件。**以前,MySQL插件可以用C或C++编写。现在插件使用的MySQL头文件包含C++代码,这意味着插件必须用C++编写,而不是C。

  • **C API。**MySQL C API现在支持与MySQL服务器进行非阻塞通信的异步函数。每个函数都是现有同步函数的异步对应项。同步功能会阻止对服务器连接的读取或写入是否必须等待。异步函数使应用程序能够检查服务器连接上的工作是否准备好继续。如果没有,应用程序可以在稍后再次检查之前执行其他工作。看见C API异步接口 (opens new window).

  • **用于强制转换的其他目标类型。**功能演员阵容CONVERT()现在支持类型转换双重的, 浮动真实的.添加到MySQL 8.0.17中。看见第12.11节,“转换函数和运算符”.

  • **JSON模式验证。**MySQL 8.0.17增加了两个功能JSON_SCHEMA_VALID()JSON_模式_验证_报告()用于再次验证JSON文档JSON模式。JSON_SCHEMA_VALID()如果文档根据架构进行验证,则返回TRUE(1),否则返回FALSE(0)。JSON_模式_验证_报告()返回一个JSON文档,其中包含有关验证结果的详细信息。以下语句适用于这两种功能:

    • 模式必须符合JSON模式规范草案4。

    • 必修的支持属性。

    • 外部资源和$ref关键字不受支持。

    • 支持正则表达式模式;无效模式会被默默忽略。

      看见第12.18.7节,“JSON模式验证功能”,以获取更多信息和示例。

  • **多值索引。**从MySQL 8.0.17开始,InnoDB支持创建多值索引,该索引是在JSON列,该列存储一个值数组,对于单个数据记录可以有多个索引记录。这样的索引使用关键部分定义,例如强制转换(数据->“$.zipcode”作为无符号数组).MySQL优化器会自动使用多值索引进行适当的查询,这可以在解释.

    作为这项工作的一部分,MySQL添加了一个新函数JSON_重叠()还有一个新的成员()接线员JSON文档,另外扩展了演员阵容使用新的大堆关键字,如下表所述:

    • JSON_重叠()比较两个JSON文件。如果它们共同包含任何键值对或数组元素,则函数返回TRUE(1);否则返回FALSE(0)。如果两个值都是标量,则函数将执行简单的相等性测试。如果一个参数是JSON数组,另一个是标量,则标量将被视为数组元素。因此JSON_重叠()起到补充的作用JSON_CONTAINS().

    • 成员()测试第一个操作数(标量或JSON文档)是否是作为第二个操作数传递的JSON数组的成员,如果是,则返回TRUE(1),如果不是,则返回FALSE(0)。不执行操作数的类型转换。

    • 投下(表示类型阵列)允许通过将JSON文档中的JSON数组转换为*json_路径*到SQL数组。类型说明符仅限于演员阵容,但二进制的(不支持)。这种用法演员阵容(以及大堆关键字)仅由支持InnoDB,并且仅用于创建多值索引。

      有关多值索引的详细信息(包括示例),请参见多值索引. 第12.18.3节,“搜索JSON值的函数”,提供有关JSON_重叠()成员(),以及使用示例。

  • 可预测的时间_区从MySQL 8.0.17开始时区会话变量可以使用集_VAR.

  • **重做日志归档。**从MySQL 8.0.17开始,InnoDB支持重做日志归档。在备份操作进行期间,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的速度,从而导致由于覆盖这些记录而丢失重做日志记录。重做日志存档功能通过将重做日志记录顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件中复制重做日志记录,从而避免潜在的数据丢失。有关更多信息,请参阅重做日志归档.

  • **克隆插件。**从MySQL 8.0.17开始,MySQL提供了一个允许克隆的克隆插件InnoDB本地数据或来自远程MySQL服务器实例的数据。本地克隆操作将克隆的数据存储在运行MySQL实例的同一服务器或节点上。远程克隆操作通过网络将克隆数据从捐赠方MySQL服务器实例传输到发起克隆操作的接收方服务器或节点。

    克隆插件支持复制。除了克隆数据外,克隆操作还从捐赠者提取和传输复制坐标,并将其应用于接收者,这样就可以使用克隆插件来配置组复制成员和副本。使用克隆插件进行资源调配比复制大量事务要快得多、效率更高。还可以将组复制成员配置为使用克隆插件作为恢复的替代方法,以便成员自动选择从种子成员检索组数据的最有效方式。

    有关更多信息,请参阅第5.6.7节,“克隆插件”第18.5.4.2节,“用于分布式恢复的克隆”.

    从MySQL 8.0.27开始,在进行克隆操作时,允许在捐赠方MySQL服务器实例上执行并发DDL操作。以前,克隆操作期间保留了一个备份锁,防止了供体上的并发DDL。要恢复到以前在克隆操作期间阻止供体上并发DDL的行为,请启用克隆块ddl变量看见第5.6.7.4节,“克隆和并发DDL”.

    从MySQL 8.0.29开始数据删除后的克隆延迟变量允许在远程克隆操作开始时删除收件人MySQL服务器实例上的现有数据后立即指定延迟期。延迟是为了在从捐赠方MySQL服务器实例克隆数据之前,为接收方主机上的文件系统提供足够的时间释放空间。某些文件系统在后台进程中异步释放空间。在这些文件系统上,删除现有数据后过早克隆数据可能会由于空间不足而导致克隆操作失败。最大延迟时间为3600秒(1小时)。默认设置为0(无延迟)。

  • **哈希连接优化。**从MySQL 8.0.18开始,只要连接中的每对表至少包含一个equi连接条件,并且没有索引应用于任何连接条件,就会使用哈希连接。哈希联接不需要索引,尽管它可以与仅应用于单表谓词的索引一起使用。在大多数情况下,哈希连接比块嵌套循环算法更有效。此处所示的连接可以通过以下方式进行优化:

    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)
    

    散列联接也可用于笛卡尔乘积,即未指定联接条件时。

    您可以看到哈希连接优化何时用于使用解释格式=树解释分析(在MySQL 8.0.20及更高版本中,您还可以使用解释,省略格式=树.)

    哈希联接可用的内存量受加入缓冲区大小.在磁盘上执行的哈希连接需要的内存超过了这个数量;磁盘上哈希联接可以使用的磁盘文件数量受以下限制:打开\u文件\u限制.

    从MySQL 8.0.19开始hash_joinMySQL 8.0.18中引入的优化器开关不再受支持(哈希)_join=on仍然作为优化器值的一部分出现_开关,但设置它不再有任何效果)。这个HASH_JOIN不加入优化器提示也不再受支持。开关和提示现在都不推荐使用;希望在未来的MySQL版本中删除它们。在MySQL 8.0.18及更高版本中,可以使用没有优化器开关。

    在MySQL 8.0.20及更高版本中,MySQL服务器不再使用块嵌套循环,并且在以前使用块嵌套循环的任何时候都会使用哈希联接,即使查询不包含相等联接条件。这适用于内部非等联接、半联接、反联接、左外联接和右外联接。t这个块嵌套循环美国国旗优化器_开关系统变量以及BNL没有优化器提示仍然受支持,但此后仅控制哈希联接的使用。此外,内部联接和外部联接(包括半联接和反联接)现在都可以使用批处理密钥访问(BKA),它以增量方式分配联接缓冲区内存,这样单个查询就不需要占用它们在解析时实际上不需要的大量资源。从MySQL 8.0.18开始,只支持用于内部联接的BKA。

    MySQL 8.0.20还将以前版本的MySQL中使用的执行器替换为迭代器执行器。这项工作包括替换管理表单查询的旧索引子查询引擎在哪里*价值*在(选择)中**来自*桌子*在哪里……)为了那些在里面未优化为半连接的查询,以及以相同形式具体化的查询,它们以前依赖于旧的执行器。

    有关更多信息和示例,请参阅第8.2.1.4节,“哈希连接优化”.另见批处理密钥访问连接.

  • **解释分析陈述。**一种新形式的解释陈述解释分析,在MySQL 8.0.18中实现,提供了有关选择声明处理查询时使用的每个迭代器的格式,并使其能够将估计成本与查询的实际成本进行比较。这些信息包括启动成本、总成本、迭代器返回的行数以及执行的循环数。

    在MySQL 8.0.21及更高版本中,此语句还支持格式=树说明符。是唯一受支持的格式。

    看见通过解释分析获取信息,以获取更多信息。

  • **查询铸注。**在8.0.18及更高版本中,MySQL在参数的数据类型和预期数据类型不匹配的表达式和条件中向查询项树中注入强制转换操作。这对查询结果或执行速度没有影响,但使执行时的查询相当于符合SQL标准的查询,同时保持与MySQL早期版本的向后兼容性。

    这种隐式转换现在在时态类型之间执行(日期, 约会时间, 时间戳, 时间)和数字类型(斯莫林, TINYINT, 中微子, 国际的/整数, 比金; 十进制的/数字的; 浮动, 双重的, 真实的; 一点)无论何时使用任何标准的数值比较运算符进行比较(=, >=, >, <, <=, <>/!=<=>).在本例中,任何尚未成为双重的是一个演员。现在还进行了铸件注射,以比较日期时间价值观和约会时间值,根据需要随时转换参数约会时间.

    从MySQL 8.0.21开始,在比较字符串类型和其他类型时,也会执行此类强制转换。强制转换的字符串类型包括烧焦, 瓦尔查尔, 二进制的, VARBINARY, 斑点, 文本, 枚举设置.当比较字符串类型的值与数字类型或,弦乐演员是双重的; 如果另一个参数的类型不是浮动, 双重的真实的,它也是为了双重的.将字符串类型与约会时间时间戳值,则字符串被强制转换为约会时间; 将字符串类型与日期,弦被抛向日期.

    通过查看解释分析, EXPLAIN FORMAT=JSON,或者,如图所示,解释格式=树:

    mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME);
    Query OK, 0 rows affected (0.62 sec)
    
    mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);
    Query OK, 0 rows affected (0.51 sec)
    
    mysql> CREATE TABLE s (c CHAR(25), vc VARCHAR(25),
        ->     bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT,
        ->     e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));
    Query OK, 0 rows affected (0.50 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double))
    (cost=0.70 rows=1)
        -> Table scan on n  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on d  (cost=0.35 rows=1)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6)))  (cost=0.72 rows=1)
        -> Table scan on d  (cost=0.37 rows=1)
        -> Hash
            -> Table scan on s  (cost=0.35 rows=1)
    
    1 row in set (0.01 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
        -> Table scan on s  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on n  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)
    

    也可以通过执行解释[格式=传统],在这种情况下,还需要发布显示警告在执行解释陈述

  • **时区支持时间戳和日期时间。**从MySQL 8.0.19开始,服务器接受带有插入日期时间的时区偏移(时间戳约会时间)价值观。该偏移量使用的格式与设置偏移量时使用的格式相同时区系统变量,但当偏移的小时数部分小于10时,需要前导零,以及'-00:00'这是不允许的。包含时区偏移的日期时间文字的示例包括'2019-12-11 10:40:30-05:00', '2003-04-14 03:30:00+10:00''2020-01-01 15:35:45+05:30'.

    选择日期时间值时不显示时区偏移。

    包含时区偏移的Datetime文字可以用作准备好的语句参数值。

    作为这项工作的一部分,用于设置时区系统变量现在也被限制在该范围内-13:59+14:00包含全部费用(仍然可以将名称值指定给时区例如“EST”, “Posix/澳大利亚/布里斯班”“欧洲/斯德哥尔摩”如果加载了MySQL时区表,则返回该变量;看见填充时区表).

    有关更多信息和示例,请参阅第5.1.15节,“MySQL服务器时区支持”以及第11.2.2节,“日期、日期时间和时间戳类型”.

  • **JSON模式检查约束失败的精确信息。**使用时JSON_SCHEMA_VALID()指定检查MySQL 8.0.19及更高版本提供了有关此类约束失败原因的精确信息。

    有关示例和更多信息,请参阅JSON_模式_VALID()并检查约束.另见第13.1.20.6节“检查约束”.

  • **行和列别名在重复键更新时具有。**从MySQL 8.0.19开始,可以使用别名引用要插入的行,以及可选的列。考虑以下事项插入桌子上的声明t有柱子的A.b:

    INSERT INTO t SET a=9,b=5
        ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);
    

    使用别名对于新行,以及在某些情况下,别名mn对于此行的列插入语句可以用许多不同的方式重写,下面给出了一些例子:

    INSERT INTO t SET a=9,b=5 AS new
        ON DUPLICATE KEY UPDATE a=new.a+new.b;
    
    INSERT INTO t VALUES(9,5) AS new
        ON DUPLICATE KEY UPDATE a=new.a+new.b;
    
    INSERT INTO t SET a=9,b=5 AS new(m,n)
        ON DUPLICATE KEY UPDATE a=m+n;
    
    INSERT INTO t VALUES(9,5) AS new(m,n)
        ON DUPLICATE KEY UPDATE a=m+n;
    

    有关更多信息和示例,请参阅第13.2.6.2节,“在重复密钥更新声明中插入…”.

  • **SQL标准显式表子句和表值构造函数。**根据SQL标准添加了表值构造函数和显式表子句。它们分别在MySQL 8.0.19中实现,如下所示:桌子声明和价值观陈述

    这个桌子声明的格式是桌子*表2\u名称*,相当于从中选择**表2\u名称*.它支持订购人限度子句(后者带有可选抵消),但不允许选择单个表列。桌子可以在任何你愿意使用同等产品的地方使用选择陈述这包括加入工会,插入选择, 代替, 创建表格。。。选择语句和子查询。例如:

    • 表t1和表t2相当于从t1选择*从t2选择*

    • 创建表t2表t1相当于创建表t2从t1中选择*

    • 从t1中选择a,其中b>任意(表t2)相当于从t1中选择a,其中b>任意(从t2中选择*.

    价值观可用于向插入, 代替选择语句,并由价值观关键字后跟一系列行构造函数(第()行)用逗号分隔。例如,声明插入t1值行(1,2,3),行(4,5,6),行(7,8,9)提供与特定于MySQL的插入t1值(1,2,3)、(4,5,6)、(7,8,9)。您也可以从价值观表值构造函数,就像创建表一样,请记住在创建表时必须提供表别名,并使用选择就像其他人一样;这包括联接、联合和子查询。

    有关桌子价值观,有关其使用示例,请参阅本文档的以下部分:

  • **优化器提示强制索引,忽略索引。**MySQL 8.0引入了索引级优化器提示,类似于中所述的传统索引提示第8.9.4节,“索引提示”.这里列出了新的提示,以及它们的力指数忽略索引等价物:

    SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2;
    
    SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;
    

    前面列出的优化器提示遵循与现有索引级优化器提示相同的语法和用法基本规则。

    这些优化器提示旨在取代力指数忽略索引,我们计划在未来的MySQL版本中弃用它,然后从MySQL中删除它。它们没有实现一个完全相同的功能使用索引; 相反,你可以雇佣一个或多个无索引, 没有加入索引, 无组索引无订单索引达到同样的效果。

    有关更多信息和使用示例,请参阅索引级优化器提示.

  • **JSON_VALUE()函数。**MySQL 8.0.21实现了一个新功能JSON_值()旨在简化JSON柱。在其最基本的形式中,它将JSON文档和指向该文档中单个值的JSON路径作为参数,并且(可选)允许您使用返回关键词。JSON_值(*json_文件*, *路径*回归*类型*)相当于:

    CAST(
        JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) )
        AS type
    );
    

    您还可以指定空荡荡的, 论错误,或两个条款,类似于JSON_表().

    你可以用JSON_值()在数据库中的表达式上创建索引的步骤JSON像这样的专栏:

    CREATE TABLE t1(
        j JSON,
        INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) )
    );
    
    INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');
    

    使用此表达式的查询(如此处所示)可以使用索引:

    SELECT name, price FROM t1
        WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;
    

    在许多情况下,这比从JSON列,然后在生成的列上创建索引。

    有关更多信息和示例,请参见的说明JSON_值().

  • **用户评论和用户属性。**MySQL 8.0.21引入了在创建或更新用户帐户时设置用户评论和用户属性的功能。用户注释由作为参数传递给用户的任意文本组成议论与a连用的子句创建用户改变用户陈述用户属性由JSON对象形式的数据组成,作为参数传递给属性子句与这两个语句中的任何一个一起使用。该属性可以包含JSON对象表示法中的任何有效键值对。只有一个议论属性可以用在一个单一的创建用户改变用户陈述

    用户注释和用户属性在内部作为JSON对象存储在一起,注释文本作为元素的值议论作为它的钥匙。这些信息可以从属性专栏信息模式。用户属性桌子因为它是JSON格式的,所以可以使用MySQL的JSON函数和运算符来解析它的内容(参见第12.18节,“JSON函数”)。用户属性的连续更改将与使用时的当前值合并JSON_MERGE_PATCH()作用

    例子:

    mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account';
    Query OK, 0 rows affected (0.33 sec)
    
    mysql> ALTER USER 'mary'@'localhost'
        -≫     ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}';
    Query OK, 0 rows affected (0.14 sec)
    
    mysql> ALTER USER 'mary'@'localhost'
        -≫     ATTRIBUTE '{"email":"mary.smith@example.com"}';
    Query OK, 0 rows affected (0.12 sec)
    
    mysql> SELECT
        ->    USER,
        ->    HOST,
        ->    ATTRIBUTE->>"$.fname" AS 'First Name',
        ->    ATTRIBUTE->>"$.lname" AS 'Last Name',
        ->    ATTRIBUTE->>"$.email" AS 'Email',
        ->    ATTRIBUTE->>"$.comment" AS 'Comment'
        -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
        -> WHERE USER='mary' AND HOST='localhost'\G
    *************************** 1. row ***************************
          USER: mary
          HOST: localhost
    First Name: Mary
     Last Name: Smith
         Email: mary.smith@example.com
       Comment: This is Mary Smith's account
    1 row in set (0.00 sec)
    

    有关更多信息和示例,请参阅第13.7.1.3节“创建用户声明”, 第13.7.1.1节“更改用户声明”第26.3.46节,“信息_模式用户_“属性表”.

  • **新优化器_切换标志。**MySQL 8.0.21为优化器_开关系统变量,如下表所述:

    • 更喜欢排序索引旗帜

      默认情况下,MySQL会尝试对任何订购人分组具有限度子句,只要优化器确定这将导致更快的执行。因为在某些情况下,为这样的查询选择不同的优化实际上执行得更好,所以现在可以通过设置更喜欢排序索引.

      此标志的默认值为在…上.

    • 子查询_到_派生旗帜

      当此标志设置为在…上,优化器将符合条件的标量子查询转换为派生表上的联接。例如,查询从t1中选择*其中t1。a>(从t2中选择计数(a)被改写为选择t1。a从t1连接(选择COUNT(t2.a)作为t2中的c)作为d,其中t1。a>d.c.

      这种优化可以应用于子查询,它是选择, 哪里, 参加条款包含一个或多个聚合函数,但不包含分组条款不相关;不使用任何不确定函数。

      优化还可以应用于表子查询,它是在里面, 不在, 存在不存在,且不包含分组.例如,查询从t1中选择*其中t1。b<0或t1。a输入(从t2中选择t2.a+1)被改写为从t1左连接中选择a,b(从t2中选择不同的1作为e1,从t2中选择a作为e2)在t1上选择d。a+1=d.e2,其中t1。b<0或d.e1不为空.

      从MySQL 8.0.24开始,这种优化也可以应用于相关标量子查询,方法是对其应用额外的分组,然后在提升的谓词上应用外部联接。例如,一个查询,如选择*FROM t1 WHERE(从t2中选择a,其中t2.a=t1.a)>0可以重写为选择t1。*从t1左外连接(选择a,将(*)从t2组计数为ct,由a)从t1导出。a=衍生的。a从何而来。a>0.MySQL执行基数检查以确保子查询不会返回多行(ER_子查询_NO_1_行 (opens new window)).看到了吗第13.2.11.7节,“相关子查询”,以获取更多信息。

      这种优化通常被禁用,因为在大多数情况下,它不会产生明显的性能优势;旗帜被设置为默认情况下。

      有关更多信息,请参阅第8.9.2节,“可切换优化”.另见第8.2.1.19节,“限额查询优化”, 第8.2.2.1节,“使用半连接转换优化IN和EXISTS子查询谓词”第8.2.2.4节,“通过合并或物化优化派生表、视图引用和公共表表达式”.

  • **XML增强。**从MySQL 8.0.21开始加载XML声明现在支持CDATA要导入的XML中的节。

  • **转换为现在支持的年份类型。**从MySQL 8.0.22开始,服务器允许强制转换.两个演员阵容CONVERT()函数支持一位数、两位数和四位数价值观对于一位数和两位数的值,允许的范围为0-99。四位数的值必须在1901-2155之间。也可以用作JSON_值()作用此函数仅支持四位数年份。

    字符串、时间和日期以及浮点值都可以强制转换为.铸造几何学价值观不支持。

    有关更多信息(包括转换规则),请参见CONVERT()作用

  • **以UTC格式检索时间戳值。**MySQL 8.0.22及更高版本支持时间戳从系统时区到UTC的列值约会时间关于检索,使用投下(*价值*在时区*说明符*作为日期时间),其中说明符是[间歇]“+00:00”“UTC”.测量的精确度约会时间如果需要,cast返回的值最多可以指定为6位小数。这个大堆此构造不支持关键字。

    时间戳还支持使用时区偏移插入表中的值。使用在时区不支持CONVERT()或任何其他MySQL函数或构造。

    有关更多信息和示例,请参阅演员阵容作用

  • **转储文件输出同步。**MySQL 8.0.22及更高版本支持用户写入文件时的定期同步选择到转储文件中选择输出文件声明。这可以通过设置选择_进入_磁盘_同步系统变量为在…上; 写入缓冲区的大小由为在缓冲区大小中选择; 默认值为131072(217)字节。

    此外,同步到磁盘后的可选延迟可以使用选择进入磁盘同步延迟; 默认值为无延迟(0毫秒)。

    有关更多信息,请参阅本项目前面引用的变量说明。

  • **单一的陈述准备。**从MySQL 8.0.22开始,prepared语句只准备了一次,而不是每次执行一次。这是在执行时完成的准备。存储过程中的任何语句也是如此;当存储过程第一次执行时,语句准备一次。

    这种变化的一个结果是,预处理语句中使用的动态参数的解析方式也发生了变化,如下所示:

    • 在准备语句时,为准备好的语句参数指定了数据类型;该类型在语句的每次后续执行中都会保持不变(除非重新编写该语句;请参见下文)。

      在准备好的语句中为给定参数或用户变量使用不同的数据类型,以便在第一次执行之后执行该语句,可能会导致该语句被重新准备;因此,在重新执行准备好的语句时,建议对给定参数使用相同的数据类型。

    • 为了符合SQL标准,不再接受使用窗口函数的以下构造:

    • 在准备好的语句中引用的用户变量现在在准备语句时确定其数据类型;该类型在语句的每个后续执行中都保持不变。

    • 由存储过程中发生的语句引用的用户变量现在在第一次执行语句时确定其数据类型;对于包含存储过程的任何后续调用,该类型仍然存在。

    • 执行表单的准备好的语句时选择 *expr1*, *expr2*, ... 从 *桌子* 订购?,传递一个整数值*ñ因为参数不再导致结果的排序ñ*th选择列表中的表达式;结果不再排序,正如预期的那样订购人 *持续的*.

      将用作预准备语句或在存储过程中的语句仅准备一次可以提高语句的性能,因为它抵消了重复准备的额外成本。这样做还可以避免准备结构的多次回滚,这是 MySQL 中许多问题的根源。

      有关详细信息,请参阅第 13.5.1 节,“准备声明”.

  • **RIGHT JOIN 作为 LEFT JOIN 处理。**从 MySQL 8.0.22 开始,服务器处理所有的实例正确加入内部作为左连接,消除了在解析时未执行完整转换的一些特殊情况。

  • **派生条件下推优化。**MySQL 8.0.22(及更高版本)为具有物化派生表的查询实现派生条件下推。对于查询,例如SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > *持续的*,现在在很多情况下可以推外在哪里条件到派生表,在这种情况下导致SELECT * FROM (SELECT i, j FROM t1 WHERE i > *持续的*) 作为 dt.

    以前,如果派生表已物化且未合并,则 MySQL 会物化整个表,然后使用在哪里健康)状况。移动在哪里使用派生条件下推优化条件进入子查询通常可以减少必须处理的行数,从而可以减少执行查询所需的时间。

    一个外在哪里当派生表不使用任何聚合或窗口函数时,可以将条件直接下推到具体化派生表。当派生表有一个通过...分组并且不使用任何窗口函数,外部在哪里条件可以下推到派生表中拥有健康)状况。这在哪里当派生表使用窗口函数并且外部在哪里引用窗口函数中使用的列划分条款。

    默认情况下启用派生条件下推,如优化器开关系统变量派生条件下推旗帜。MySQL 8.0.22 中添加的标志设置为默认;要禁用特定查询的优化,您可以使用NO_DERIVED_CONDITION_PUSHDOWN优化器提示(也在 MySQL 8.0.22 中添加)。如果由于以下原因禁用优化派生条件下推被设置为离开,您可以使用给定查询启用它DERIVED_CONDITION_PUSHDOWN.

    派生条件下推优化不能用于包含限制条款。在 MySQL 8.0.29 之前,当查询包含时也不能使用优化联盟.在 MySQL 8.0.29 及更高版本中,大多数情况下条件可以下推到联合的两个查询块;看第 8.2.2.5 节,“导出条件下推优化”, 了解更多信息。

    另外,本身使用子查询的条件不能下推,在哪里不能将条件下推到同时是外连接的内表的派生表。有关其他信息和示例,请参阅第 8.2.2.5 节,“导出条件下推优化”.

  • **MySQL 授权表上的非锁定读取。**从 MySQL 8.0.22 开始,为了允许对 MySQL 授权表进行并发 DML 和 DDL 操作,以前在 MySQL 授权表上获得行锁的读取操作将作为非锁定读取执行。

    现在在 MySQL 授权表上作为非锁定读取执行的操作包括:

    • 选择通过连接列表和子查询从授权表中读取数据的语句和其他只读语句,包括选择...分享语句,使用任何事务隔离级别。

    • 使用任何事务隔离级别从授权表(通过连接列表或子查询)读取数据但不修改它们的 DML 操作。

      有关其他信息,请参阅授予表并发.

  • **对 FROM 的 64 位支持_UNIXTIME(), UNIX_时间戳(),转换_TZ()。**从 MySQL 8.0.28 开始,函数FROM_UNIXTIME(),UNIX_TIMESTAMP(), 和转换_TZ()在支持它们的平台上处理 64 位值。这包括 64 位版本的 Linux、MacOS 和 Windows。

    在兼容的平台上,UNIX_TIMESTAMP()现在处理的值高达'3001-01-18 23:59:59.999999'世界标准时间,和FROM_UNIXTIME()可以转换自 Unix 纪元以来最多 32536771199.999999 秒的值;转换_TZ()现在接受不超过的值'3001-01-18 23:59:59.999999'转换后的 UTC。

    这些函数在 32 位平台上的行为不受这些更改的影响。的行为时间戳类型也不受影响(在任何平台上);用于处理之后的日期时间'2038-01-19 03:14:07.999999', UTC, 使用约会时间而是键入。

    有关更多信息,请参阅刚刚讨论的各个功能的描述,在第 12.7 节,“日期和时间函数”.

  • **资源分配控制。**从 MySQL 8.0.28 开始,您可以通过检查所有普通用户发出的查询使用的内存量全局连接内存状态变量。(这个总数不包括系统用户使用的资源,例如MySQL root。它还不包括用户占用的任何内存。)InnoDB缓冲池。)

    要启用的更新全局连接内存,有必要设置全局连接内存跟踪=1; 这是0(关闭)默认情况下。你可以控制频率全局连接内存通过设置进行更新连接\内存\块\大小.

    通过设置此处列出的任一或两个系统变量,也可以在会话或全局级别或两者上为普通用户设置内存使用限制:

    • 连接\内存\限制:为每个连接分配的内存量。任何用户超过此限制时,都会拒绝来自此用户的新查询。

    • 全局连接内存限制:为所有连接分配的内存量。一旦超过此限制,任何普通用户的新查询都会被拒绝。

      这些限制不适用于系统进程或管理帐户。

      有关更多信息,请参阅引用变量的描述。

  • **分离XA事务。**MySQL 8.0.29增加了对XA事务的支持,这些事务一旦准备好,就不再连接到原始连接。这意味着它们可以由另一个连接提交或回滚,并且当前会话可以立即开始另一个事务。

    系统变量xa_分离_上_准备控制XA事务是否分离;默认值是在…上,这将导致分离所有XA事务。有效时,XA事务不允许使用临时表。

    有关更多信息,请参阅第13.3.8.2节,“XA事务状态”.

  • **自动二进制日志清除控制。**MySQL 8.0.29增加了binlog\u过期\u日志\u自动\u清除系统变量,它为启用和禁用二进制日志的自动清除提供了一个接口。这是启用的(在…上)默认情况下;要禁用二进制日志文件的自动清除,请将此变量设置为.

    binlog\u过期\u日志\u自动\u清除必须是在…上以便继续自动清除二进制日志文件;此变量的值优先于任何其他服务器选项或变量的值,包括(但不限于)binlog_过期_日志_秒.

    设置binlog\u过期\u日志\u自动\u清除对…没有影响清除二进制日志.

  • **条件例程和触发器创建语句。**从MySQL 8.0.29开始,以下语句支持如果不存在选项:

# MySQL 8.0中不推荐的功能

以下功能在MySQL 8.0中已被弃用,并可能在未来的系列中删除。如果显示了替代方案,则应更新应用程序以使用它们。

对于使用MySQL 8.0中不推荐的功能并已在更高的MySQL系列中删除的应用程序,当从MySQL 8.0源复制到更高的系列副本时,语句可能会失败,或者可能会对源和副本产生不同的影响。为了避免此类问题,应该对使用8.0中不推荐的功能的应用程序进行修改,以避免这些功能,并在可能的情况下使用其他功能。

  • 这个utf8mb3字符集已弃用。请使用utf8mb4相反

  • 以下字符集已弃用:

  • 因为缓存_sha2_密码是MySQL 8.0中的默认身份验证插件,提供了shau密码身份验证插件,shau密码不赞成;预计它将在MySQL的未来版本中被删除。使用shau密码应该迁移使用缓存_sha2_密码相反

  • 这个验证密码插件已经重新实现,以使用组件基础设施。的插件形式验证密码仍然可用,但现在已弃用;预计它将在MySQL的未来版本中被删除。使用该插件的MySQL安装应该过渡到使用该组件。看见第6.4.3.3节,“转换到密码验证组件”.

  • 这个发动机合同条款改变表空间删除表空间不推荐使用语句。

  • 这个PAD_CHAR_至_全长不推荐使用SQL模式。

  • 自动增量不推荐支持类型为的列浮动双重的(以及任何同义词)。考虑移除自动增量属性,或将其转换为整数类型。

  • 这个未签名属性不推荐用于类型为的列浮动, 双重的十进制的(以及任何同义词)。考虑使用简单的检查而不是为此类列设置约束。

  • 漂浮(*M*,*D*)加倍(*M*,*D*)指定类型列的位数的语法浮动双重的(以及任何同义词)是一个非标准的MySQL扩展。此语法已被弃用。

  • 这个零填充对于数值数据类型,属性是不推荐的,对于整型数据类型,显示宽度属性也是不推荐的。考虑使用一种替代方法来产生这些属性的效果。例如,应用程序可以使用LPAD()函数将焊盘编号归零至所需的宽度,也可以将格式化后的数字存储在烧焦柱。

  • 对于字符串数据类型二进制的属性是一个非标准的MySQL扩展,是指定二进制文件的缩写(_垃圾箱)列字符集(如果未指定列字符集,则为表默认字符集)的排序规则。在MySQL 8.0中,这种非标准的二进制的因为utf8mb4字符集有多个_垃圾箱排序规则,所以二进制的属性已弃用;预计MySQL的未来版本将删除对它的支持。应用程序应该调整为使用显式_垃圾箱而不是排序。

    使用二进制的指定数据类型或字符集的步骤保持不变。

  • MySQL的早期版本支持非标准的速记表达式ASCII码UNICODE分别为拉丁字符集1字符集ucs2. ASCII码UNICODE已弃用(MySQL 8.0.28及更高版本),现在生成警告。使用字符集相反,在这两种情况下。

  • 非标准C风格&&, ||!是标准SQL的同义词的运算符, 分别不推荐使用运算符。使用非标准运算符的应用程序应调整为使用标准运算符。

    笔记

    使用||除非管道SQL模式已启用。那样的话||表示SQL标准字符串连接运算符)。

  • 这个JSON_MERGE()函数已弃用。使用JSON_MERGE_PRESERVE()相反

  • 这个SQL\u计算\u找到\u行查询修饰符和伴随找到_行()函数已弃用。看到了吗找到_行()关于替代策略的信息说明。

  • 支持TABLESPACE=innodb_file_per_table表空间=innodb_临时带有创建临时表从MySQL 8.0.13开始就不推荐使用。

  • 对于选择声明,使用进入后面的条款从…起但不是在最后选择从MySQL 8.0.20开始就不推荐使用。最好将进入在声明的最后。

    对于协会语句,这两个变体包含进入从MySQL 8.0.20开始,已弃用:

  • 同花顺的主人从MySQL 8.0.23开始就不推荐使用。相反,截断性能模式主机缓存表:

    TRUNCATE TABLE performance_schema.host_cache;
    

    这个截断表操作需要这张桌子的特权。

  • 这个mysql_升级客户端已被弃用,因为它具有升级中的系统表的功能mysql系统模式和其他模式中的对象已移动到MySQL服务器中。看见第2.11.3节,“MySQL升级过程升级了什么”.

  • 这个--无dd升级不推荐使用服务器选项。它被--升级选项,可以更好地控制数据字典和服务器升级行为。

  • 这个mysql\u升级\u信息不推荐使用创建数据目录并用于存储MySQL版本号的文件;预计它将在MySQL的未来版本中被删除。

  • 这个中继日志信息文件系统变量和--主信息文件选项已被弃用。以前,它们用于指定中继日志信息日志和源信息日志的名称中继日志信息存储库=文件master_info_repository=文件已设置,但这些设置已被弃用。中继日志信息日志和源信息日志文件的使用已被崩溃安全副本表取代,这是MySQL 8.0中的默认值。

  • 这个排序数据的最大长度系统变量现在不推荐使用,因为优化器的更改使其过时且无效。

  • 不推荐使用这些用于压缩服务器连接的旧参数:--压缩客户端命令行选项;这个MYSQL_OPT_COMPRESS选择mysql_选项() (opens new window)C API函数;这个slave_压缩_协议系统变量。有关要改用的参数的信息,请参见第4.2.8节,“连接压缩控制”.

  • 使用MYSQL_PWD不推荐使用指定MySQL密码的环境变量。

  • 使用价值观()在中访问新行值的步骤插入关于重复密钥更新从MySQL 8.0.20开始就不推荐使用。而是为新行和新列使用别名。

  • 因为论错误之前空荡荡的当调用JSON_表()与SQL标准相反,这种语法现在在MySQL中被弃用。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印一条警告。在一个文件中指定这两个条款时JSON_表()调用,确保空荡荡的首先使用。

  • 带有索引前缀的列从未被支持作为表分区键的一部分;以前,在创建、更改或升级分区表时,这些都是允许的,但被表的分区功能排除在外,并且服务器没有发出发生这种情况的警告。这种许可行为现在已被弃用,并可能在MySQL的未来版本中被删除,在该版本中,在分区键中使用任何此类列都会导致创建表格改变桌子他们的声明被拒绝了。

    从MySQL 8.0.21开始,每当使用索引前缀的列被指定为分区键的一部分时,就会为每个这样的列生成警告。每当创建表格改变桌子语句被拒绝,因为建议的分区键中的所有列都会有索引前缀,因此产生的错误现在提供了拒绝的确切原因。在这两种情况下,都包括分区函数中使用的列通过使用空按键划分()条款

    有关更多信息和示例,请参阅键分区不支持列索引前缀.

  • InnoDB memcached插件从MySQL 8.0.22开始就被弃用;预计MySQL的未来版本将删除对它的支持。

  • 这个诱人的_使用_mmap从MySQL 8.0.26开始,变量已被弃用;预计MySQL的未来版本将删除对它的支持。

  • 这个二进制的从MySQL 8.0.27开始,operator就被弃用了,您应该期待它在MySQL的未来版本中被删除。使用二进制的现在会引起一个警告。使用强制转换(…作为二进制)相反

  • 这个默认认证插件从MySQL 8.0.27开始,变量已被弃用;预计MySQL的未来版本将删除对它的支持。

    这个默认认证插件变量仍在MySQL 8.0.27中使用,但与新版本结合使用,且优先级低于新版本身份验证策略系统变量,在MySQL 8.0.27中引入了多因素身份验证功能。有关详细信息,请参阅默认的身份验证插件.

  • 这个--中止从属事件计数--断开从属事件计数从MySQL 8.0.29开始,MySQL测试套件使用的、通常不用于生产的服务器选项已被弃用;预计这两个选项都将在MySQL的未来版本中删除。

  • 这个myisam_修复_螺纹系统变量和myisamchk --并行恢复从MySQL 8.0.29开始,选项已被弃用;在MySQL的未来版本中,这两种支持都将被删除。

    在MySQL 8.0.29中,除1(默认值)之外的值myisam_修复_螺纹发出警告。

  • 之前,MySQL接受了日期, 时间, 约会时间时间戳包含任意数量(任意)分隔符字符的文字,以及约会时间时间戳在日期和时间部分之前、之后以及之间具有任意数量的空白字符的文本。从MySQL 8.0.29开始,每当文本值包含以下任何一项时,服务器都会发出不推荐警告:

    • 一个或多个非标准分隔符字符

    • 多余的分隔符字符

    • 除空格字符(“”,0x20)

    • 多余空格字符

      即使存在多个问题,每个时态值也会发出一个弃用警告。在严格模式下,此警告不会升级为错误,因此执行插入当严格模式生效时,这样的值仍然成功。

      您应该期望在MySQL的未来版本中删除非标准行为,现在就采取措施确保您的应用程序不依赖它。

      看见日期和时间上下文中的字符串和数字文本,以获取更多信息和示例。

  • 这个副本\u并行\u类型系统变量及其关联的服务器选项--副本并行类型从MySQL 8.0.29开始就不推荐使用。从本版本开始,读取或设置此值会引发弃用警告;预计它将在MySQL的未来版本中被删除。

  • 这个--跳过主机缓存从MySQL 8.0.30开始,服务器选项已被弃用;预计它将在未来的MySQL版本中删除。使用主机缓存大小而是系统变量。

# MySQL 8.0中删除的功能

以下项目已过时,并已在MySQL 8.0中删除。如果显示了替代方案,则应更新应用程序以使用它们。

对于使用MySQL 8.0中删除的功能的MySQL 5.7应用程序,当从MySQL 5.7源复制到MySQL 8.0副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免此类问题,应该修改使用MySQL 8.0中删除的功能的应用程序,以避免这些问题,并在可能的情况下使用替代方案。

  • 这个innodb_为_binlog锁定_unsafe_系统变量已删除。这个阅读承诺隔离级别提供了类似的功能。

  • 这个信息_模式_统计MySQL 8.0.0中引入的变量被删除并替换为信息_模式_统计_到期在MySQL 8.0.3中。

    信息_模式_统计_到期定义缓存的过期设置信息模式表格统计。有关更多信息,请参阅第8.2.3节,“优化信息_“模式查询”.

  • 与废弃设备相关的代码InnoDBMySQL 8.0.3中删除了系统表。信息模式基于InnoDB系统表被数据字典表上的内部系统视图替换。影响InnoDB 信息模式视图被重命名为:

    表1.1重命名的InnoDB信息模式视图

    老名字 新名字
    INNODB_系统_列 INNODB_列
    INNODB_系统_数据文件 INNODB_数据文件
    INNODB_系统_字段 INNODB_字段
    INNODB_SYS_FOREIGN INNODB_FOREIGN
    INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
    INNODB_系统索引 INNODB_索引
    INNODB_系统_表 INNODB_表
    INNODB_SYS_表空间 INNODB_表空间
    INNODB_系统_表状态 INNODB_表状态
    INNODB_系统_虚拟 INNODB_虚拟

    升级到MySQL 8.0.3或更高版本后,更新引用以前版本的所有脚本InnoDB 信息模式查看名称。

  • 已删除与帐户管理相关的以下功能:

    • 使用授予创建用户。相反,使用创建用户.遵循这种做法会使无自动创建用户SQL模式对于授予语句,因此它也被删除,并且当sql_模式选项文件中的选项可防止mysqld从一开始。

    • 使用授予修改权限分配以外的帐户属性。这包括身份验证、SSL和资源限制属性。相反,在创建帐户时使用创建用户或者之后用改变用户.

    • 由密码'*验证字符串*'语法创建用户授予.相反,使用认同*auth_插件*就像*验证字符串*'对于创建用户改变用户,在哪里'*验证字符串*'值的格式与指定的插件兼容。

      此外,因为通过密码识别语法被删除了以密码识别的方式记录内置信息系统变量是多余的,已删除。

    • 这个密码()作用此外,密码()移除意味着设置密码…=密码('*验证字符串*')语法不再可用。

    • 这个旧密码系统变量。

  • 已删除查询缓存。移除包括以下项目:

    • 这个刷新查询缓存重置查询缓存声明。

    • 这些系统变量:查询缓存限制, 查询缓存最小存储单元, 查询缓存大小, 查询缓存类型, 查询\u缓存\u锁定\u无效.

    • 这些状态变量:Qcache_free_块, Qcache_free_内存, Qcache_点击率, Qcache_插件, Qcache_lowmem_李子, Qcache_not_cached, Qcache_查询_缓存中的_, Qcache_总块数.

    • 这些线程声明:检查缓存查询的权限, 正在检查查询缓存以进行查询, 使查询缓存项无效, 将缓存结果发送到客户端, 将结果存储在查询缓存中, 正在等待查询缓存锁定.

    • 这个SQL_缓存 选择修饰语。

      这些不推荐使用的查询缓存项仍然不推荐使用,但没有效果;希望在未来的MySQL版本中删除它们:

    • 这个SQL_NO_缓存 选择修饰语。

    • 这个ndb_缓存_检查_时间系统变量。

      这个有_查询_缓存系统变量仍然不推荐使用,并且始终具有值; 预计它将在未来的MySQL版本中被删除。

  • 数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名以查找数据库。因此--忽略数据库目录选项和忽略_db_dirs系统变量是无关的,将被删除。

  • DDL日志(也称为元数据日志)已被删除。从MySQL 8.0.3开始,这个功能由数据字典处理innodb_ddl_日志桌子看见查看DDL日志.

  • 这个tx_隔离tx_只读系统变量已被删除。使用事务隔离事务_只读相反

  • 这个同步系统变量已被删除,因为.frm文件已经过时。

  • 这个安全认证系统变量和--安全认证客户端选项已被删除。这个MYSQL\u安全\u身份验证选择mysql_选项() (opens new window)C API函数被删除。

  • 这个多量程计数系统变量被删除。

  • 这个日志警告系统变量和--日志警告服务器选项已被删除。使用日志错误详细而是系统变量。

  • 全球范围内sql_log_bin系统变量已删除。sql_log_bin仅具有会话范围,并且应用程序依赖于访问@@全球。sql_log_bin应该进行调整。

  • 这个元数据锁定缓存大小元数据\锁定\哈希\实例系统变量被删除。

  • 未使用的日期格式, datetime_格式, 时间格式max_tmp_表系统变量被删除。

  • 这些不推荐的兼容SQL模式将被删除:DB2, MAXDB, MSSQL, MYSQL323, MYSQL40,甲骨文,PostgreSQL 后,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS.他们不能再分配给sql_mode系统变量或用作允许的值mysql转储 - 兼容的选项。

    删除最大数据库意味着时间戳数据类型创建表要么更改表被视为时间戳,并且不再被视为约会时间.

  • 已弃用的ASC要么DESC限定词通过...分组子句被删除。以前依赖的查询通过...分组排序可能会产生与以前的 MySQL 版本不同的结果。要生成给定的排序顺序,请提供订购方式条款。

  • 扩展分区的关键字解释声明已被删除。这些关键字是不必要的,因为它们的效果始终处于启用状态。

  • 这些与加密相关的项目被删除:

    • 编码()解码()职能。

    • 加密()功能。

    • DES_ENCRYPT(), 和DES_DECRYPT()函数,--des-key 文件选项,have_crypt系统变量DES_KEY_FILE选项冲洗声明,以及HAVE_CRYPT 制作选项。

      代替已删除的加密功能:对于加密(),考虑使用SHA2()而不是单向散列。对于其他人,请考虑使用AES_ENCRYPT()AES_DECRYPT()反而。

  • 在 MySQL 5.7 中,不推荐使用多个名称下可用的几个空间函数,以使空间函数命名空间更加一致,目标是每个空间函数名称以英石_如果它执行一个精确的操作,或者MBR如果它执行基于最小边界矩形的操作。在 MySQL 8.0 中,不推荐使用的函数被删除,只留下相应的英石_MBR职能:

    • 这些功能被删除,有利于MBR名称:包含(), 不相交(), 等于(), 相交(), 重叠(), 之内().

    • 这些功能被删除,有利于英石_名称:区域(), 二进制(), AsText(), AsWKB(), AsWKT(), 缓冲(), 质心(), 凸包(), 十字架(), 方面(), 距离(), 端点(), 信封(), 外环(), GeomCollFromText(), GeomCollFromWKB(), GeomFromText(), GeomFromWKB(), GeometryCollectionFromText(), GeometryCollectionFromWKB(), GeometryFromText(), GeometryFromWKB(), 几何N(), 几何类型(), 内环N(), 已经关闭(), 是空的(), 简单(), LineFromText(), LineFromWKB(), LineStringFromText(), LineStringFromWKB(), MLineFromText(), MLineFromWKB(), MPointFromText(), MPointFromWKB(), MPolyFromText(), MPolyFromWKB(), MultiLineStringFromText(), MultiLineStringFromWKB(), MultiPointFromText(), MultiPointFromWKB(), MultiPolygonFromText(), MultiPolygonFromWKB(), 几何数(), NumInteriorRings(), 点数(), PointFromText(), PointFromWKB(), 点N(), PolyFromText(), PolyFromWKB(),PolygonFromText(),PolygonFromWKB(),SRID(),起点(),触摸(),X(),Y().

    • G长度()被删除以支持ST_长度().

  • 中描述的功能第 12.17.4 节,“从 WKB 值创建几何值的函数”以前接受 WKB 字符串或几何参数。不再允许几何参数并产生错误。有关将查询从使用几何参数迁移出来的指南,请参阅该部分。

  • 解析器不再处理\N作为同义词空值在 SQL 语句中。采用空值反而。

    此更改不会影响使用执行的文本文件导入或导出操作加载数据要么选择...进入文件, 为此空值继续由\N.看第 13.2.7 节,“加载数据语句”.

  • 程序分析()语法被删除。

  • 客户端--ssl--ssl-验证服务器证书选项已被删除。采用--ssl 模式=必需代替--ssl=1要么--启用-ssl.采用--ssl-mode=禁用代替--ssl=0,--skip-ssl, 要么--禁用-ssl.采用--ssl-mode=VERIFY_IDENTITY代替--ssl-验证服务器证书选项。(服务器端--ssl选项仍然可用,但自 MySQL 8.0.26 起已弃用,并且在未来的 MySQL 版本中可能会被删除。)

    对于 C API,MYSQL_OPT_SSL_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT选项mysql_options() (opens new window)对应客户端--ssl--ssl-验证服务器证书选项并被删除。采用MYSQL_OPT_SSL_MODE期权价值为SSL_MODE_REQUIRED要么SSL_MODE_VERIFY_IDENTITY反而。

  • --临时池服务器选项已删除。

  • ignore_builtin_innodb系统变量被删除。

  • 服务器不再将包含特殊字符的 pre-MySQL 5.1 数据库名称转换为 5.1 格式,并添加了一个#mysql50#字首。由于不再执行这些转换,--fix-db-names--fix-table-names选项mysql检查, 这升级数据目录名称的条款更改数据库声明,以及Com_alter_db_upgrade状态变量被删除。

    仅支持从一个主要版本升级到另一个主要版本(例如,从 5.0 到 5.1,或从 5.1 到 5.5),因此几乎不需要将旧的 5.0 数据库名称转换为当前版本的 MySQL。作为一种解决方法,在升级到更新版本之前,将 MySQL 5.0 安装升级到 MySQL 5.1。

  • mysql_安装_D b程序已从 MySQL 发行版中删除。数据目录初始化应该通过调用来执行mysqld- 初始化要么--初始化不安全选项。除此之外--引导程序选项mysqld被使用的mysql_安装_D b被删除,并且INSTALL_SCRIPTDIR 制作控制安装位置的选项mysql_安装_D b去掉了。

  • 通用分区处理程序已从 MySQL 服务器中删除。为了支持给定表的分区,用于表的存储引擎现在必须提供自己的(“本机”)分区处理程序。这- 划分--skip-partition选项从 MySQL 服务器中删除,并且与分区相关的条目不再显示在输出中显示插件或在INFORMATION_SCHEMA.PLUGINS桌子。

    目前有两个 MySQL 存储引擎提供原生分区支持:InnoDB新开发银行.其中,只有InnoDB在 MySQL 8.0 中受支持。使用任何其他存储引擎在 MySQL 8.0 中创建分区表的任何尝试都会失败。

    **升级的后果。**使用其他存储引擎直接升级分区表InnoDB(如MyISAM) 从 MySQL 5.7(或更早版本)到 MySQL 8.0 不受支持。处理这样的表有两种选择:

    • 删除表的分区,使用ALTER TABLE ... 删除分区.

    • 将用于表的存储引擎更改为InnoDB, 和ALTER TABLE ... 引擎=INNODB.

      必须为每个已分区的非InnoDB将服务器升级到 MySQL 8.0 之前的表。否则,升级后无法使用此类表。

      由于会导致使用没有分区支持的存储引擎的分区表的表创建语句现在失败并出现错误(ER_查看_不是_已实现),您必须确保转储文件中的任何语句(例如由mysql转储) 从您希望导入到创建分区表的 MySQL 8.0 服务器的旧版本 MySQL 中,不要同时指定存储引擎,例如MyISAM没有本机分区处理程序。您可以通过执行以下任一操作来做到这一点:

    • 删除对分区的任何引用创建表使用值的语句存储引擎以外的选项InnoDB.

    • 指定存储引擎为InnoDB, 或允许InnoDB默认用作表的存储引擎。

      有关详细信息,请参阅第 24.6.2 节,“与存储引擎相关的分区限制”.

  • 系统和状态变量信息不再保留在INFORMATION_SCHEMA.这些表被删除:GLOBAL_VARIABLES,SESSION_VARIABLES,全球状态,会话状态.请改用相应的性能架构表。看第 27.12.14 节,“性能模式系统变量表”, 和第 27.12.15 节,“性能模式状态变量表”.除此之外显示兼容性_56系统变量被删除。用于系统和状态变量信息的过渡期INFORMATION_SCHEMA表已移至性能模式表,不再需要。这些状态变量被删除:Slave_heartbeat_period,Slave_last_heartbeat,Slave_received_heartbeats,Slave_reried_transactions,从属运行.他们提供的信息可在性能模式表中找到;看迁移到性能模式系统和状态变量表 (opens new window).

  • 性能模式setup_timers表被删除,因为是打钩排在性能计时器桌子。

  • 库mysqld删除了嵌入式服务器库,以及:

    • mysql_options() (opens new window) MYSQL_OPT_GUESS_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION, MYSQL_OPT_USE_REMOTE_CONNECTION, 和MYSQL_SET_CLIENT_IP选项

    • mysql_配置 --libmysqld-libs, --嵌入式库, 和--嵌入式选项

    • 制作 WITH_EMBEDDED_SERVER, WITH_EMBEDDED_SHARED_LIBRARY, 和INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项

    • (无证)mysql --服务器参数选项

    • mysql测试 --嵌入式服务器,--服务器参数, 和--服务器文件选项

    • mysql测试_嵌入式mysql_客户_测试_嵌入式测试程序

  • mysql_插入实用程序被删除。替代方法包括在服务器启动时使用--插件加载要么--plugin-load-add选项,或在运行时使用安装插件陈述。

  • 解析IP实用程序被删除。nslookup,主持人, 要么可以代替使用。

  • 解决_堆_倾倒实用程序被删除。来自官方 MySQL 构建的堆栈跟踪始终是符号化的,因此无需使用解决_堆_倾倒.

  • 以下服务器错误代码未使用且已被删除。应更新专门针对这些错误进行测试的应用程序。

    ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
    ER_BINLOG_ROW_RBR_TO_SBR
    ER_BINLOG_ROW_WRONG_TABLE_DEF
    ER_CANT_ACTIVATE_LOG
    ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
    ER_CANT_CREATE_FEDERATED_TABLE
    ER_CANT_CREATE_SROUTINE
    ER_CANT_DELETE_FILE
    ER_CANT_GET_WD
    ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
    ER_CANT_SET_WD
    ER_CANT_WRITE_LOCK_LOG_TABLE
    ER_CREATE_DB_WITH_READ_LOCK
    ER_CYCLIC_REFERENCE
    ER_DB_DROP_DELETE
    ER_DELAYED_NOT_SUPPORTED
    ER_DIFF_GROUPS_PROC
    ER_DISK_FULL
    ER_DROP_DB_WITH_READ_LOCK
    ER_DROP_USER
    ER_DUMP_NOT_IMPLEMENTED
    ER_ERROR_DURING_CHECKPOINT
    ER_ERROR_ON_CLOSE
    ER_EVENTS_DB_ERROR
    ER_EVENT_CANNOT_DELETE
    ER_EVENT_CANT_ALTER
    ER_EVENT_COMPILE_ERROR
    ER_EVENT_DATA_TOO_LONG
    ER_EVENT_DROP_FAILED
    ER_EVENT_MODIFY_QUEUE_ERROR
    ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
    ER_EVENT_OPEN_TABLE_FAILED
    ER_EVENT_STORE_FAILED
    ER_EXEC_STMT_WITH_OPEN_CURSOR
    ER_FAILED_ROUTINE_BREAK_BINLOG
    ER_FLUSH_MASTER_BINLOG_CLOSED
    ER_FORM_NOT_FOUND
    ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
    ER_FRM_UNKNOWN_TYPE
    ER_GOT_SIGNAL
    ER_GRANT_PLUGIN_USER_EXISTS
    ER_GTID_MODE_REQUIRES_BINLOG
    ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
    ER_HASHCHK
    ER_INDEX_REBUILD
    ER_INNODB_NO_FT_USES_PARSER
    ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
    ER_LOAD_DATA_INVALID_COLUMN_UNUSED
    ER_LOGGING_PROHIBIT_CHANGING_OF
    ER_MALFORMED_DEFINER
    ER_MASTER_KEY_ROTATION_ERROR_BY_SE
    ER_NDB_CANT_SWITCH_BINLOG_FORMAT
    ER_NEVER_USED
    ER_NISAMCHK
    ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
    ER_NO_FILE_MAPPING
    ER_NO_GROUP_FOR_PROC
    ER_NO_RAID_COMPILED
    ER_NO_SUCH_KEY_VALUE
    ER_NO_SUCH_PARTITION__UNUSED
    ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
    ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
    ER_ORDER_WITH_PROC
    ER_PARTITION_SUBPARTITION_ERROR
    ER_PARTITION_SUBPART_MIX_ERROR
    ER_PART_STATE_ERROR
    ER_PASSWD_LENGTH
    ER_QUERY_ON_MASTER
    ER_RBR_NOT_AVAILABLE
    ER_SKIPPING_LOGGED_TRANSACTION
    ER_SLAVE_CHANNEL_DELETE
    ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
    ER_SLAVE_MUST_STOP
    ER_SLAVE_WAS_NOT_RUNNING
    ER_SLAVE_WAS_RUNNING
    ER_SP_GOTO_IN_HNDLR
    ER_SP_PROC_TABLE_CORRUPT
    ER_SQL_MODE_NO_EFFECT
    ER_SR_INVALID_CREATION_CTX
    ER_TABLE_NEEDS_UPG_PART
    ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
    ER_UNEXPECTED_EOF
    ER_UNION_TABLES_IN_DIFFERENT_DIR
    ER_UNSUPPORTED_BY_REPLICATION_THREAD
    ER_UNUSED1
    ER_UNUSED2
    ER_UNUSED3
    ER_UNUSED4
    ER_UNUSED5
    ER_UNUSED6
    ER_VIEW_SELECT_DERIVED_UNUSED
    ER_WRONG_MAGIC
    ER_WSAS_FAILED
    
  • 已弃用的INFORMATION_SCHEMA INNODB_LOCKSINNODB_LOCK_WAITS表被删除。使用性能模式数据锁data_lock_waits代替表。

    笔记

    在 MySQL 5.7 中,LOCK_TABLE列中的INNODB_LOCKS表和锁定表列中的系统图式innodb_lock_waitsx$innodb_lock_waits视图包含组合的模式/表名称值。在 MySQL 8.0 中,数据锁表和系统架构视图包含单独的架构名称和表名称列。看第 28.4.3.9 节,“innodb_锁_等待和 x$innodb_锁_观望”.

  • InnoDB不再支持压缩临时表。什么时候innodb_strict_mode已启用(默认),创建临时表如果返回错误ROW_FORMAT=压缩要么KEY_BLOCK_SIZE被指定。如果innodb_strict_mode被禁用,发出警告并使用非压缩行格式创建临时表。

  • InnoDB不再创造.isl文件(InnoDB符号链接文件)在 MySQL 数据目录之外创建表空间数据文件时。这innodb_directories选项现在支持定位在数据目录之外创建的表空间文件。

    通过此更改,在服务器脱机时通过手动修改.isl不再支持文件。现在支持移动远程表空间文件innodb_directories选项。看第 15.6.3.6 节,“在服务器脱机时移动表空间文件”.

  • 下列InnoDB文件格式变量被删除:

    • innodb_file_format

    • innodb_file_format_check

    • innodb_file_format_max

    • innodb_large_prefix

      文件格式变量是创建与早期版本兼容的表所必需的InnoDB在 MySQL 5.1 中。现在 MySQL 5.1 已经到了其产品生命周期的终点,不再需要这些选项。

      文件格式列已从INNODB_TABLESINNODB_TABLESPACES信息模式表。

  • innodb_support_xa删除了系统变量,该变量支持 XA 事务中的两阶段提交。InnoDB始终启用对 XA 事务中的两阶段提交的支持。

  • 已删除对 DTrace 的支持。

  • JSON_APPEND()功能被删除。采用JSON_ARRAY_APPEND()反而。

  • 支持将表分区放在共享中InnoDBMySQL 8.0.13 中删除了表空间。共享表空间包括InnoDB系统表空间和通用表空间。有关识别共享表空间中的分区并将它们移动到 file-per-table 表空间的信息,请参阅第 2.11.5 节,“准备升级安装”.

  • 支持在语句以外的语句中设置用户变量在 MySQL 8.0.13 中已弃用。此功能可能会在 MySQL 9.0 中删除。

  • --ndb 错误选项被删除。使用数据库_错误实用程序代替。

  • innodb_undo_logs变量被删除。这innodb_rollback_segments变量执行相同的功能,应改为使用。

  • Innodb_available_undo_logs状态变量已被删除。每个表空间的可用回滚段数可以使用显示变量,如“innodb_rollback_segments”;

  • 从 MySQL 8.0.14 开始,以前不推荐使用的innodb_undo_tablespaces变量不再是可配置的。有关详细信息,请参阅第 15.6.3.4 节,“撤消表空间”.

  • 支持ALTER TABLE ...升级分区声明已被删除。

  • 从 MySQL 8.0.16 开始,支持internal_tmp_disk_storage_engine系统变量已被删除;磁盘上的内部临时表现在总是使用InnoDB存储引擎。看磁盘内部临时表的存储引擎,了解更多信息。

  • DISABLE_SHARED 制作选项未使用并已被删除。

  • myisam_repair_threadsMySQL 8.0.30 的系统变量。