本节总结了MySQL 8.0中添加,弃用和删除的内容。配套部分列出了在MySQL 8.0中添加,弃用或删除的MySQL服务器选项和变量;请参见第 1.4 节 “MySQL 8.0 中添加、弃用或删除的服务器和状态变量及选项”。
以下功能已添加到 MySQL 8.0 中:
数据字典。 MySQL现在包含一个事务性数据字典,用于存储有关数据库对象的信息。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。有关更多信息,请参见第 14 章 “MySQL 数据字典”。
原子数据定义语句(原子 DDL)。 原子 DDL 语句将与 DDL 操作关联的数据字典更新、存储引擎操作和二进制日志写入合并到单个原子事务中。有关更多信息,请参见第 13.1.1 节 “原子数据定义语句支持”。
升级过程。 以前,在安装新版本的MySQL后,MySQL服务器在下次启动时自动升级数据字典表,之后DBA应该手动调用mysql_upgrade来升级架构中的系统表,以及其他架构中的对象,例如架构和用户架构。mysqlsys
从MySQL 8.0.16开始,服务器执行以前由mysql_upgrade处理的任务。安装新的MySQL版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,并且不依赖于DBA调用mysql_upgrade。此外,服务器还会更新帮助表的内容(mysql_upgrade没有这样做)。新的 --upgrade 服务器选项提供了对服务器如何执行自动数据字典和服务器升级操作的控制。有关更多信息,请参见第 2.11.3 节 “MySQL 升级过程升级的内容”。
会话重用。 MySQL Server现在默认支持SSL会话重用,并具有超时设置,以控制服务器维护会话缓存的时间,该缓存建立允许客户端请求会话重用新连接的时间段。所有MySQL客户端程序都支持会话重用。有关服务器端和客户端配置的信息,请参见第 6.3.5 节 “重用 SSL 会话”。
此外,C 应用程序现在可以使用 C API 功能为加密连接启用会话重用(请参阅 SSL 会话重用)。
安全和帐户管理。 添加了这些增强功能,以提高安全性并在帐户管理中实现更大的 DBA 灵活性:
系统数据库中的授权表现在是(事务性)表。以前,这些是(非交易)表。授权表存储引擎的更改是帐户管理报表行为随附更改的基础。以前,命名多个用户的帐户管理语句(如“创建用户”或“删除用户”)可能对某些用户成功,而对其他用户则失败。现在,每个语句都是事务性的,并且对于所有指定用户都成功,或者回滚,如果发生任何错误,则不起作用。如果该语句成功,则写入二进制日志,但如果失败,则不会写入该语句。在这种情况下,将发生回滚,并且不进行任何更改。有关更多信息,请参见第 13.1.1 节 “原子数据定义语句支持”。mysqlInnoDBMyISAM
新的身份验证插件可用。与插件一样,它实现了 SHA-256 密码哈希,但使用缓存来解决连接时的延迟问题。它还支持更多的传输协议,并且不需要针对 OpenSSL 进行链接,以实现基于 RSA 密钥对的密码交换功能。请参见第 6.4.1.2 节 “缓存 SHA-2 可插拔身份验证”。caching_sha2_passwordsha256_passwordcaching_sha2_password
和 身份验证插件提供比插件更安全的密码加密,并提供比 更好的性能。由于这些优越的安全性和性能特征,它现在是首选的身份验证插件,也是默认的身份验证插件而不是。有关此默认插件更改对服务器操作以及服务器与客户端和连接器的兼容性的影响的信息,请参阅caching_sha2_password作为首选身份验证插件。caching_sha2_passwordsha256_passwordmysql_native_passwordcaching_sha2_passwordsha256_passwordcaching_sha2_passwordmysql_native_password
MySQL 企业版 SASL LDAP 身份验证插件现在支持 GSSAPI/Kerberos 作为 Linux 上 MySQL 客户端和服务器的身份验证方法。这在 Linux 环境中非常有用,其中应用程序使用微软活动目录访问 LDAP,默认情况下,活动目录启用了 Kerberos。请参阅 LDAP 身份验证方法。
MySQL企业版现在支持一种身份验证方法,该方法使用户能够使用Kerberos向MySQL服务器进行身份验证,前提是可以使用或可以获得适当的Kerberos票证。有关细节,请参见第 6.4.1.8 节 “Kerberos 可插拔认证”。
MySQL现在支持角色,这些角色是命名的权限集合。可以创建和删除角色。角色可以具有授予和撤消的权限。角色可以授予用户帐户或从用户帐户撤消。可以从授予该帐户的角色中选择帐户的活动适用角色,并且可以在该帐户的会话期间进行更改。有关更多信息,请参见第 6.2.10 节 “使用角色”。
MySQL现在包含用户帐户类别的概念,系统和常规用户根据他们是否具有SYSTEM_USER权限来区分。请参见第 6.2.11 节 “帐户类别”。
以前,除了某些架构之外,无法授予全局应用的权限。如果启用了partial_revokes系统变量,现在可以做到这一点。请参见第 6.2.12 节 “使用部分撤销的权限限制”。
GRANT 语句有一个子句,该子句指定有关用于语句执行的权限上下文的其他信息。此语法在 SQL 级别是可见的,尽管其主要目的是通过使部分撤销施加的授予者特权限制的所有节点之间启用统一复制,方法是使这些限制出现在二进制日志中。请参见第 13.7.1.6 节 “授权声明”。AS user [WITH ROLE]
MySQL现在维护有关密码历史记录的信息,从而可以限制以前密码的重用。DBA 可以要求在一定数量的密码更改或时间段内不从以前的密码中选择新密码。可以全局以及基于每个帐户建立密码重用策略。
现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使 DBA 能够在不证明用户知道当前密码的情况下阻止用户更改密码。可以全局以及基于每个帐户建立密码验证策略。
现在允许帐户具有双重密码,这使得分阶段的密码更改能够在复杂的多服务器系统中无缝执行,而不会造成停机。
MySQL现在使管理员能够配置用户帐户,以便由于密码不正确而导致的连续登录失败次数过多,从而导致临时帐户锁定。所需的失败次数和锁定时间可按帐户进行配置。
这些新功能使 DBA 能够更全面地控制密码管理。有关详细信息,请参见第 6.2.15 节 “密码管理”。
MySQL 现在支持 FIPS 模式(如果使用开放软件编译),并且开放课程库和 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 支持需要进行以下更改:
authentication_policy系统变量通过控制可以使用的因素数以及每个因素允许的身份验证类型来建立 MFA 策略。这对如何使用“创建用户”和“更改用户”语句的身份验证相关子句施加了限制。
客户端程序具有用于指定多个密码的新 --密码1、--密码2 和 --password3 命令行选项。对于使用 C API 的应用程序,mysql_options4() C API 函数的新选项将启用相同的功能。MYSQL_OPT_USER_PASSWORD
此外,MySQL企业版现在支持使用智能卡,安全密钥和生物识别读取器等设备对MySQL服务器进行身份验证。此身份验证方法基于联机快速标识 (FIDO) 标准,并在服务器端和客户端使用一对插件。服务器端FIDO身份验证插件仅包含在MySQL企业版发行版中。它不包含在MySQL社区发行版中。但是,客户端插件包含在所有发行版中,包括社区发行版。这使来自任何发行版的客户端能够连接到加载了服务器端插件的服务器。authentication_fidoauthentication_fido_client
多因素身份验证可以使用现有的 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_privilege_check时,TABLE_ENCRYPTION_ADMIN权限允许覆盖默认加密设置。有关更多信息,请参阅 为模式和常规表空间定义加密缺省值。DEFAULT ENCRYPTION
创新数据库增强功能。 添加了以下增强功能:InnoDB
每次值更改时,当前最大自动递增计数器值都会写入重做日志,并保存到每个检查点的引擎专用系统表中。这些更改使当前最大自动增量计数器值在服务器重新启动后保持不变。此外:
有关更多信息,请参见第 15.6.1.6 节 “InnoDB 中的AUTO_INCREMENT处理”和 InnoDB AUTO_INCREMENT计数器初始化。
遇到索引树损坏时, 会将损坏标志写入重做日志,从而使损坏标志崩溃安全。 还会将内存中的损坏标志数据写入每个检查点的引擎专用系统表。在恢复期间,从两个位置读取损坏标志,并在将内存中的表和索引对象标记为已损坏之前合并结果。InnoDBInnoDBInnoDB
memcached 插件支持多个操作(在单个 memcached 查询中获取多个键值对)和范围查询。请参见第 15.20.4 节 “InnoDB 内存缓存的多个获取和范围查询支持”。InnoDBget
可以使用新的动态变量innodb_deadlock_detect来禁用死锁检测。在高并发系统上,当多个线程等待同一个锁时,死锁检测可能会导致速度变慢。有时,禁用死锁检测并依赖innodb_lock_wait_timeout设置在发生死锁时进行事务回滚可能会更有效。
新INFORMATION_SCHEMA。INNODB_CACHED_INDEXES表报告缓冲池中为每个索引缓存的索引页数。InnoDB
InnoDB临时表现在在共享临时表空间 中创建。ibtmp1
InnoDB支持 和 选项与 和 锁定读取语句。 使语句在请求的行被另一个事务锁定时立即返回。 从结果集中删除锁定的行。请参见使用 NOWAIT 锁定读取并发和跳过锁定。NOWAITSKIP LOCKEDSELECT ... FOR SHARESELECT ... FOR UPDATENOWAITSKIP LOCKED
SELECT ... FOR SHARE替换 ,但仍可用于向后兼容。这些语句是等效的。但是,并支持 、 和 选项。请参见第 13.2.10 节 “SELECT 语句”。SELECT ... LOCK IN SHARE MODELOCK IN SHARE MODEFOR UPDATEFOR SHARENOWAITSKIP LOCKEDOF tbl_name
OF 将锁定查询应用于命名表。tbl_name
ADD PARTITION、 、 、 和 ALTER TABLE 选项受本地就地分区 API 支持,可以与 和 子句一起使用。DROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITIONREBUILD PARTITIONALGORITHM={COPY|INPLACE}LOCK
DROP PARTITION删除存储在分区中的数据并删除分区。但是,使用 或 old_alter_table=ON 重建分区表,并尝试将数据从已删除的分区移动到具有兼容定义的另一个分区。无法移动到另一个分区的数据将被删除。ALGORITHM=INPLACEDROP PARTITIONALGORITHM=COPYPARTITION ... VALUES
存储引擎现在使用MySQL数据字典,而不是它自己的存储引擎特定的数据字典。有关数据字典的信息,请参见第 14 章 “MySQL 数据字典”。InnoDB
mysql系统表和数据字典表现在在MySQL数据目录中命名的单个表空间文件中创建。以前,这些表是在数据库目录中的单个表空间文件中创建的。InnoDBmysql.ibdInnoDBmysql
MySQL 8.0中引入了以下撤消表空间更改:
默认情况下,撤消日志现在驻留在初始化 MySQL 实例时创建的两个撤消表空间中。不再在系统表空间中创建撤消日志。
从MySQL 8.0.14开始,可以使用创建撤消表空间语法在运行时的选定位置创建其他撤消表空间。
CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
使用 CREATE UNDO 表空间语法创建的撤消表空间可以在运行时使用删除 UNDO 表空间语法。
DROP UNDO TABLESPACE tablespace_name;
ALTER 撤消表空间语法可用于将撤消表空间标记为活动或非活动。
ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};
显示表空间状态的列已添加到INFORMATION_SCHEMA。INNODB_TABLESPACES表。撤消表空间必须处于某种状态,然后才能将其删除。STATEempty
默认情况下,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 AUTO_INCREMENT锁定模式。
对于使用基于语句的复制的系统,新的innodb_autoinc_lock_mode默认设置可能会中断依赖于顺序自动增量值的应用程序。若要还原以前的默认值,请将innodb_autoinc_lock_mode设置为 1。
重命名常规表空间受 ALTER 表空间支持...重命名为语法。
默认情况下禁用的新innodb_dedicated_server变量可用于根据在服务器上检测到的内存量自动配置以下选项:InnoDB
此选项适用于在专用服务器上运行的 MySQL 服务器实例。有关更多信息,请参见第 15.8.12 节 “为专用 MySQL 服务器启用自动配置”。
新INFORMATION_SCHEMA。INNODB_TABLESPACES_BRIEF视图为表空间提供空间、名称、路径、标志和空间类型数据。InnoDB
与MySQL捆绑在一起的zlib库版本从版本1.2.3提升到版本1.2.11。MySQL在zlib库的帮助下实现了压缩。
如果使用压缩表,请参见第 2.11.4 节 “MySQL 8.0 中的更改”,了解相关的升级含义。InnoDB
序列化字典信息 (SDI) 存在于除全局临时表空间和撤消表空间文件之外的所有表空间文件中。SDI 是表和表空间对象的序列化元数据。SDI数据的存在提供了元数据冗余。例如,如果数据字典不可用,则可以从表空间文件中提取字典对象元数据。SDI 提取是使用 ibd2sdi 工具执行的。SDI数据以格式存储。InnoDBJSON
在表空间文件中包含 SDI 数据会增加表空间文件大小。SDI 记录需要单个索引页,默认情况下,索引页的大小为 16KB。但是,SDI数据在存储时会被压缩,以减少存储占用空间。
存储引擎现在支持原子 DDL,这可确保 DDL 操作完全提交或回滚,即使服务器在操作期间停止也是如此。有关更多信息,请参见第 13.1.1 节 “原子数据定义语句支持”。InnoDB
当服务器处于脱机状态时,可以使用innodb_directories选项将表空间文件移动或复原到新位置。有关更多信息,请参见第 15.6.3.6 节 “在服务器脱机时移动表空间文件”。
实现了以下重做日志记录优化:
用户线程现在可以并发写入日志缓冲区,而无需同步写入。
用户线程现在可以按宽松的顺序将脏页添加到刷新列表中。
专用日志线程现在负责将日志缓冲区写入系统缓冲区、将系统缓冲区刷新到磁盘、通知用户线程有关写入和刷新重做的信息、维护宽松刷新列表顺序所需的延迟以及写入检查点。
添加了系统变量,用于配置等待刷新重做的用户线程对旋转延迟的使用:
innodb_log_wait_for_flush_spin_hwm:定义最大平均日志刷新时间,超过该时间,用户线程在等待刷新重做时不再旋转。
innodb_log_spin_cpu_abs_lwm:定义最低 CPU 使用率,低于该数量,用户线程在等待刷新重做时不再旋转。
innodb_log_spin_cpu_pct_hwm:定义最大 CPU 使用率,超过该 CPU 使用率,用户线程在等待刷新重做时不再旋转。
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 开始,以下更改表操作受支持:ALGORITHM=INSTANT
添加列。此功能也称为“即时添加列”。存在限制。请参见第 15.12.1 节 “联机 DDL 操作”。
添加或删除虚拟列。
添加或删除列默认值。
更改索引类型。
重命名表。
仅支持修改数据字典中的元数据的操作。不会对表进行元数据锁定,并且表数据不受影响,从而使操作瞬间生效。如果未显式指定,则默认情况下由支持它的操作使用。如果 指定但不支持,则操作会立即失败并显示错误。ALGORITHM=INSTANTALGORITHM=INSTANTALGORITHM=INSTANT
有关支持的操作的更多信息,请参见第 15.12.1 节 “联机 DDL 操作”。ALGORITHM=INSTANT
从MySQL 8.0.13开始,存储引擎支持存储二进制大型对象(BLOB)类型列。此增强功能可提高使用包含 BLOB 数据的临时表的查询的性能。以前,包含 BLOB 数据的临时表存储在由 internal_tmp_disk_storage_engine 定义的磁盘存储引擎中。有关更多信息,请参见第 8.4.4 节 “MySQL 中的内部临时表使用”。TempTable
从MySQL 8.0.13开始,静态数据加密功能支持常规表空间。以前,只能加密每表文件表空间。为了支持常规表空间的加密,“创建表空间”和“更改表空间”语法已扩展为包含子句。InnoDBENCRYPTION
INFORMATION_SCHEMA。INNODB_TABLESPACES表现在包含一列,该列指示表空间是否已加密。ENCRYPTION
添加了性能模式阶段工具,以允许监视常规表空间加密操作。stage/innodb/alter tablespace (encryption)
禁用该变量可通过排除缓冲池页来减小核心文件的大小。要使用此变量,必须启用core_file变量,并且操作系统必须支持 Linux 3.4 及更高版本中支持的 的非 POSIX 扩展。有关更多信息,请参见第 15.8.3.7 节 “从核心文件中排除缓冲池页”。innodb_buffer_pool_in_core_fileInnoDBMADV_DONTDUMPmadvise()
从MySQL 8.0.13开始,用户创建的临时表和优化器创建的内部临时表存储在会话临时表空间中,这些表空间从临时表空间池分配给会话。当会话断开连接时,其临时表空间将被截断并释放回池。在以前的发行版中,临时表是在全局临时表空间 () 中创建的,在删除临时表后,全局临时表空间不会将磁盘空间返回到操作系统。ibtmp1
innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是数据目录中的目录。#innodb_temp
INNODB_SESSION_TEMP_TABLESPACES表提供有关会话临时表空间的元数据。
全局临时表空间 () 现在存储对用户创建的临时表所做的更改的回滚段。ibtmp1
从MySQL 8.0.14开始,支持并行集群索引读取,这可以提高CHECK TABLE性能。此功能不适用于二级索引扫描。必须将innodb_parallel_read_threads会话变量设置为大于 1 的值,才能进行并行聚集索引读取。默认值为 4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树数确定,以较小者为准。InnoDB
从 8.0.14 开始,启用innodb_dedicated_server变量时,将根据自动配置的缓冲池大小配置日志文件的大小和数量。以前,日志文件大小是根据服务器上检测到的内存量配置的,并且不会自动配置日志文件数。
从 8.0.14 开始,CREATE TABLESPACE 语句的子句是可选的,它允许没有 FILE 特权的用户创建表空间。在没有子句的情况下执行的 CREATE 表空间语句隐式创建具有唯一文件名的表空间数据文件。ADD DATAFILEADD DATAFILE
默认情况下,当 TempTable 存储引擎占用的内存量超过temptable_max_ram变量定义的内存限制时,TempTable 存储引擎将开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始,此行为由temptable_use_mmap变量控制。禁用temptable_use_mmap会导致 TempTable 存储引擎使用磁盘上的内部临时表而不是内存映射文件作为其溢出机制。有关详细信息,请参阅内部临时表存储引擎。InnoDB
从MySQL 8.0.16开始,静态数据加密功能支持系统表空间的加密。系统表空间包含系统数据库和 MySQL 数据字典表。有关更多信息,请参见第 15.13 节 “InnoDB 静态数据加密”。InnoDBmysqlmysqlmysql
MySQL 8.0.16中引入的innodb_spin_wait_pause_multiplier变量可以更好地控制线程等待获取互斥锁或rw锁时发生的自旋锁定轮询延迟的持续时间。可以更精细地调整延迟,以考虑不同处理器架构上 PAUSE 指令持续时间的差异。有关更多信息,请参见第 15.8.8 节 “配置自旋锁轮询”。
InnoDBMySQL 8.0.17中,通过更好地利用读取线程,减少并行扫描期间发生的预取活动的读取线程I / O,以及通过支持并行扫描分区,大型数据集的并行读取线程性能得到了改善。
并行读取线程功能由innodb_parallel_read_threads变量控制。现在的最大设置为 256,这是所有客户端连接的线程总数。如果达到线程限制,连接将回退到使用单个线程。
MySQL 8.0.18中引入的innodb_idle_flush_pct变量允许在空闲期间对页面刷新施加限制,这有助于延长固态存储设备的使用寿命。请参见限制空闲期间的缓冲区刷新。
从MySQL 8.0.19开始,支持用于生成直方图统计信息的高效数据采样。请参见直方图统计分析。InnoDB
从MySQL 8.0.20开始,双写缓冲区存储区域驻留在双写文件中。在以前的发行版中,存储区域驻留在系统表空间中。将存储区域移出系统表空间可减少写入延迟、增加吞吐量,并在放置双写缓冲区页方面提供灵活性。为高级双写缓冲区配置引入了以下系统变量:
定义双写缓冲区文件目录。
定义双写文件的数量。
定义批量写入的每个线程的最大双写页数。
定义要在批处理中写入的双重写入页数。
有关更多信息,请参见第 15.6.4 节 “双写缓冲区”。
争用感知事务调度(CATS)算法在MySQL 8.0.20中得到了改进,该算法对等待锁定的事务进行优先级排序。事务调度权重计算现在完全在单独的线程中执行,从而提高了计算性能和准确性。
删除了也用于交易调度的先进先出(FIFO)算法。FIFO 算法通过 CATS 算法增强功能呈现为冗余。以前由 FIFO 算法执行的交易调度现在由 CATS 算法执行。
表中添加了一列,该列允许查询由 CATS 算法分配的事务调度权重。TRX_SCHEDULE_WEIGHTINFORMATION_SCHEMA.INNODB_TRX
添加了以下计数器以监视代码级事务计划事件:INNODB_METRICS
lock_rec_release_attempts
尝试释放记录锁的次数。
lock_rec_grant_attempts
尝试授予记录锁定的次数。
lock_schedule_refreshes
分析等待图以更新事务计划权重的次数。
有关更多信息,请参见第 15.7.6 节 “事务调度”。
从MySQL 8.0.21开始,为了提高需要访问表和行资源的锁定队列的操作的并发性,锁定系统互斥()被分片闩锁取代,锁定队列被分组到表和页面锁定队列分片中,每个分片由专用互斥保护。以前,单锁系统互斥锁保护所有锁队列,这是高并发系统上的争用点。新的分片实现允许对锁定队列进行更精细的访问。lock_sys->mutex
锁定系统互斥锁 () 已替换为以下分片闩锁:lock_sys->mutex
由 64 个读写锁定对象 () 组成的全局锁存器 ()。访问单个锁定队列需要共享的全局闩锁和锁定队列分片上的闩锁。需要访问所有锁定队列的操作采用独占全局闩锁,该闩锁会锁定所有表和页锁定队列分片。lock_sys->latches.global_latchrw_lock_t
表分片闩锁 (),实现为 512 个互斥锁的数组,每个互斥体专用于 512 个表锁定队列分片中的一个。lock_sys->latches.table_shards.mutexes
页面分片闩锁 (),实现为 512 个互斥锁的数组,每个互斥体专用于 512 个页面锁定队列分片中的一个。lock_sys->latches.page_shards.mutexes
用于监视单个锁定系统互斥锁的性能模式工具已被用于监视新的全局、表分片和页面分片闩锁的工具所取代: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开始,使用该子句在数据目录之外创建的表和表分区数据文件仅限于 已知的目录。此更改允许数据库管理员控制表空间数据文件的创建位置,并确保在恢复期间可以找到数据文件。DATA DIRECTORYInnoDB
无法再在撤消表空间目录(innodb_undo_directory)中创建常规和每表文件表空间数据文件(文件),除非 直接知道 。.ibdInnoDB
已知目录是由 datadir、innodb_data_home_dir 和 innodb_directories 变量定义的目录。
截断驻留在每表文件表空间中的表将删除现有表空间并创建一个新表空间。从MySQL 8.0.21开始,在默认位置创建新表空间,如果当前表空间目录未知,则会向错误日志中写入警告。要让截断表在其当前位置创建表空间,请在运行截断表之前将目录添加到innodb_directories设置中。InnoDBInnoDB
从MySQL 8.0.21开始,可以使用更改实例{启用启用来启用和禁用重做日志记录|禁用} REDO_LOG语法。此功能旨在将数据加载到新的 MySQL 实例中。禁用重做日志记录有助于避免重做日志写入,从而加快数据加载速度。
新的INNODB_REDO_LOG_ENABLE权限允许启用和禁用重做日志记录。
新的Innodb_redo_log_enabled状态变量允许监视重做日志记录状态。
请参阅禁用重做日志记录。
启动时,根据数据存储在数据字典中的表空间文件路径验证已知表空间文件的路径,以防表空间文件已移动到其他位置。MySQL 8.0.21 中引入的新innodb_validate_tablespace_paths变量允许禁用表空间路径验证。此功能适用于未移动表空间文件的环境。禁用表空间路径验证可缩短具有大量表空间文件的系统上的启动时间。InnoDB
有关更多信息,请参见第 15.6.3.7 节 “禁用表空间路径验证”。
从MySQL 8.0.21开始,在支持原子DDL的存储引擎上,创建表...当使用基于行的复制时,SELECT 语句将作为一个事务记录在二进制日志中。以前,它被记录为两个事务,一个用于创建表,另一个用于插入数据。进行此更改后,创建表 ...SELECT 语句现在对于基于行的复制是安全的,并且允许与基于 GTID 的复制一起使用。有关更多信息,请参见第 13.1.1 节 “原子数据定义语句支持”。
在繁忙的系统上截断撤消表空间可能会影响性能,因为相关的刷新操作会从缓冲池中除去旧的撤消表空间页,并将新撤消表空间的初始页刷新到磁盘。为了解决此问题,从MySQL 8.0.21开始删除刷新操作。
旧的撤消表空间页在最近最少使用时被动释放,或者在下一个完整检查点被删除。现在,在截断操作期间,将重做记录新撤消表空间的初始页,而不是刷新到磁盘,这也提高了撤消表空间截断操作的持久性。
为了防止由于撤消表空间截断操作过多而导致的潜在问题,检查点之间对同一撤消表空间的截断操作现在限制为 64。如果超过限制,撤消表空间仍可设置为非活动状态,但在下一个检查点之后才会被截断。
删除了与已失效的撤消截断刷新操作关联的INNODB_METRICS计数器。删除的计数器包括:、、和 。undo_truncate_sweep_countundo_truncate_sweep_usecundo_truncate_flush_countundo_truncate_flush_usec
从MySQL 8.0.22开始,新的innodb_extend_and_initialize变量允许在Linux上配置如何为每个表的文件和通用表空间分配空间。缺省情况下,当操作需要表空间中的额外空间时,会将页分配到表空间,并以物理方式将 NULL 写入这些页。如果频繁分配新页,此行为会影响性能。您可以在 Linux 系统上禁用innodb_extend_and_initialize,以避免将 NULL 物理写入新分配的表空间页。禁用innodb_extend_and_initialize时,将使用调用分配空间,从而保留空间而不实际写入 NULL。InnoDBInnoDBposix_fallocate()
操作不是原子操作,因此在为表空间文件分配空间和更新文件元数据之间可能会发生故障。此类故障可能会使新分配的页面处于未初始化状态,从而导致在尝试访问这些页面时失败。要防止出现这种情况,请在分配新的表空间页之前写入重做日志记录。如果页分配操作中断,则在恢复期间将从重做日志记录重播该操作。posix_fallocate()InnoDBInnoDB
从MySQL 8.0.23开始,支持加密属于加密表空间的双写文件页的加密。这些页使用关联表空间的加密密钥进行加密。有关更多信息,请参见第 15.13 节 “InnoDB 静态数据加密”。InnoDB
MySQL 8.0.23中引入的temptable_max_mmap变量定义了TempTable存储引擎在开始在磁盘上存储内部临时表数据之前允许从内存映射(MMAP)文件分配的最大内存量。设置为 0 将禁用 MMAP 文件的分配。有关更多信息,请参见第 8.4.4 节 “MySQL 中的内部临时表使用”。
MySQL 8.0.23中引入的选项定义了在表空间变满时扩展表空间大小的量,从而可以以更大的增量扩展表空间大小。“创建表”、“更改表”、“创建表空间”和“更改表空间”语句支持该选项。有关更多信息,请参见第 15.6.3.9 节 “表空间AUTOEXTEND_SIZE配置”。AUTOEXTEND_SIZEInnoDBAUTOEXTEND_SIZE
已将大小列添加到INFORMATION_SCHEMA。INNODB_TABLESPACES表。AUTOEXTEND_SIZE
MySQL 8.0.26 中引入的innodb_segment_reserve_factor系统变量允许配置保留为空页的表空间文件段页的百分比。有关更多信息,请参阅 配置保留文件段页的百分比。
在支持系统调用的平台上,MySQL 8.0.26中引入的innodb_use_fdatasync变量允许使用而不是操作系统刷新。除非后续数据检索需要,否则系统调用不会刷新对文件元数据的更改,从而提供潜在的性能优势。fdatasync()fdatasync()fsync()fdatasync()
从MySQL 8.0.28开始,tmp_table_size变量定义了由TempTable存储引擎创建的任何单个内存中内部临时表的最大大小。适当的大小限制可防止单个查询消耗过多的全局 TempTable 资源。请参见内部临时表存储引擎。
从MySQL 8.0.28开始,innodb_open_files变量,定义一次可以打开的文件数量,可以在运行时使用语句进行设置。该语句执行设置新限制的存储过程。InnoDBSELECT innodb_set_open_files_limit(N)
为了防止非 LRU 管理的文件占用整个innodb_open_files限制,非 LRU 托管文件被限制为innodb_open_files限制的 90%,这将为 LRU 托管文件保留 10% 的innodb_open_files限制。
innodb_open_files限制包括临时表空间文件,这些文件以前未计入限制。
从 MySQL 8.0.28, 支持改变表 ...使用 重命名列操作。InnoDBALGORITHM=INSTANT
有关此 DDL 操作和其他支持 DDL 操作的更多信息,请参见第 15.12.1 节 “联机 DDL 操作”。ALGORITHM=INSTANT
从 MySQL 8.0.29, 支持改变表 ...使用 删除列操作。InnoDBALGORITHM=INSTANT
在MySQL 8.0.29之前,即时添加的列只能作为表的最后一列添加。从MySQL 8.0.29开始,可以将即时添加的列添加到表中的任何位置。
立即添加或删除的列会创建受影响行的新版本。最多允许 64 行版本。新列已添加到INFORMATION_SCHEMA。INNODB_TABLES表以跟踪行版本数。TOTAL_ROW_VERSIONS
有关支持的 DDL 操作的更多信息,请参见第 15.12.1 节 “联机 DDL 操作”。ALGORITHM=INSTANT
从MySQL 8.0.30开始,innodb_doublewrite系统变量支持和设置。使用此设置时,数据库页内容不会写入双写缓冲区,并且恢复不会使用双写缓冲区来修复不完整的页写入。此轻量级设置仅用于检测不完整的页面写入。该设置等效于现有设置。有关更多信息,请参见第 15.6.4 节 “双写缓冲区”。DETECT_ONLYDETECT_AND_RECOVERDETECT_ONLYDETECT_AND_RECOVERON
从MySQL 8.0.30开始,支持动态配置重做日志容量。可以在运行时设置innodb_redo_log_capacity系统变量,以增加或减少重做日志文件占用的磁盘空间总量。InnoDB
通过此更改,重做日志文件的数量及其默认位置也已更改。从MySQL 8.0.30开始,在数据目录的目录中维护32个重做日志文件。以前,默认情况下,在数据目录中创建了两个重做日志文件,重做日志文件的数量和大小由innodb_log_files_in_group和innodb_log_file_size变量控制。这两个变量现已弃用。InnoDB#innodb_redoInnoDB
定义设置时,将忽略innodb_log_files_in_group和innodb_log_file_size设置;否则,这些设置将用于计算设置(innodb_log_files_in_group * innodb_log_file_size = )。如果未设置这些变量,则重做日志容量将设置为默认值,即104857600字节 (100MB)。innodb_redo_log_capacityinnodb_redo_log_capacityinnodb_redo_log_capacityinnodb_redo_log_capacity
提供了几个状态变量,用于监视重做日志和重做日志大小调整操作。
有关详细信息,请参见第 15.6.5 节 “重做日志”。
在MySQL 8.0.31中,有两个新的状态变量用于监视在线缓冲池大小调整操作。Innodb_buffer_pool_resize_status_code状态变量报告一个状态代码,指示联机缓冲池大小调整操作的阶段。Innodb_buffer_pool_resize_status_progress状态变量报告一个百分比值,指示每个阶段的进度。
有关更多信息,请参见第 15.8.3.1 节 “配置 InnoDB 缓冲池大小”。
字符集支持。 默认字符集已从 更改为 。该字符集具有几个新的排序规则,包括 ,这是MySQL中可用于Unicode的第一个日语特定排序规则。有关更多信息,请参见第 10.10.1 节 “Unicode 字符集”。latin1utf8mb4utf8mb4utf8mb4_ja_0900_as_cs
JSON 增强功能。 对 MySQL 的 JSON 功能进行了以下增强或添加:
添加了 ->>(内联路径)运算符,该运算符等效于对 JSON_EXTRACT() 的结果调用 JSON_UNQUOTE()。。
这是对MySQL 5.7中引入的列路径运算符->的改进; 等效于 。内联路径运算符可以在任何可以使用 的地方使用,例如 SELECT 列列表、子句和 子句。有关更多信息,请参阅运算符的说明以及 JSON 路径语法。col->>"$.path"JSON_UNQUOTE(col->"$.path")JSON_UNQUOTE(JSON_EXTRACT())WHEREHAVINGORDER BYGROUP BY
添加了两个 JSON 聚合函数JSON_ARRAYAGG() 和 JSON_OBJECTAGG()。 采用列或表达式作为其参数,并将结果聚合为单个 JSON 数组。表达式可以计算为任何MySQL数据类型;这不一定是一个值。 采用两列或表达式,将其解释为键和值;它将结果作为单个对象返回。有关更多信息和示例,请参见第 12.20 节 “聚合函数”。JSON_ARRAYAGG()JSONJSON_OBJECTAGG()JSON
添加了 JSON 实用程序函数 JSON_PRETTY(),该函数以易于阅读的格式输出现有的 JSON 值;每个 JSON 对象成员或数组值都打印在单独的行上,子对象或数组相对于其父对象或数组应有 2 个空格。
此函数还可处理可解析为 JSON 值的字符串。
有关更多详细信息和示例,请参见第 12.18.8 节 “JSON 实用程序函数”。
使用 对查询中的 JSON 值进行排序时,每个值现在由排序键的可变长度部分表示,而不是由固定大小为 1K 的部分表示。在许多情况下,这可以减少过度使用。例如,标量甚至值实际上需要很少的字节,因此填充占用了此空间的其余部分(高达90%或更多)。此更改对性能具有以下好处:ORDER BYINTBIGINT
排序缓冲区空间现在得到更有效的利用,因此文件排序不需要像使用固定长度的排序键那样早或经常刷新到磁盘。这意味着可以在内存中对更多数据进行排序,从而避免不必要的磁盘访问。
较短的密钥可以比较长的密钥更快地进行比较,从而显著提高性能。对于完全在内存中执行的排序以及需要写入磁盘和从磁盘读取的排序,情况也是如此。
在MySQL 8.0.2中添加了对列值的部分就地更新的支持,这比完全删除现有JSON值并在其位置上写入新值更有效,就像以前更新任何列时所做的那样。要应用此优化,必须使用 JSON_SET()、JSON_REPLACE() 或 JSON_REMOVE() 应用更新。 无法将新元素添加到正在更新的 JSON 文档中;文档中的值不能占用比更新前更多的空间。有关要求的详细讨论,请参阅 JSON 值的部分更新。JSONJSON
JSON 文档的部分更新可以写入二进制日志,占用的空间比记录完整的 JSON 文档少。当使用基于语句的复制时,部分更新始终按此方式记录。要使其适用于基于行的复制,必须首先设置 binlog_row_value_options=PARTIAL_JSON;有关详细信息,请参阅此变量的说明。
添加了 JSON 实用程序函数JSON_STORAGE_SIZE() 和 JSON_STORAGE_FREE()。 返回用于在任何部分更新之前的 JSON 文档的二进制表示形式的存储空间(以字节为单位)(请参阅上一项)。 显示 JSON 类型的表列在使用 或 进行部分更新后剩余的空间量;如果新值的二进制表示形式小于前一个值的二进制表示形式,则此值大于零。JSON_STORAGE_SIZE()JSON_STORAGE_FREE()JSON_SET()JSON_REPLACE()
这些函数中的每一个还接受 JSON 文档的有效字符串表示形式。对于此类值,返回其二进制表示形式在转换为 JSON 文档后所使用的空间。对于包含 JSON 文档的字符串表示形式的变量,返回零。如果任何一个函数的(非空)参数无法解析为有效的 JSON 文档,并且该参数为 。则任一函数都会产生错误。JSON_STORAGE_SIZE()JSON_STORAGE_FREE()NULLNULL
有关更多信息和示例,请参见第 12.18.8 节 “JSON 实用程序函数”。
JSON_STORAGE_SIZE()并在 MySQL 8.0.2 中实现。JSON_STORAGE_FREE()
在 MySQL 8.0.2 中添加了对范围(如 XPath 表达式)的支持。在此版本中还添加了对关键字和相对寻址的支持,以便始终选择数组中的最后一个(编号最高的)元素和倒数第二个元素。 和使用它的表达式也可以包含在范围定义中。例如,返回最后两个元素,但其中一个元素来自数组。有关其他信息和示例,请参阅搜索和修改 JSON 值。$[1 to 5]last$[last]$[last-1]last$[last-2 to last-1]
添加了一个旨在符合 RFC 7396 的 JSON 合并函数。JSON_MERGE_PATCH()在 2 个 JSON 对象上使用时,会将它们合并到一个 JSON 对象中,该对象的成员是以下集合的联合:
第一个对象的每个成员,其第二个对象中没有具有相同键的成员。
第二个对象的每个成员,其成员在第一个对象中没有具有相同键,并且其值不是 JSON 文本。null
每个成员都有一个键,该键存在于两个对象中,并且其在第二个对象中的值不是 JSON 文本。null
作为这项工作的一部分,JSON_MERGE() 函数已重命名为 JSON_MERGE_PRESERVE()。 在MySQL 8.0中继续被识别为别名,但现在已被弃用,并且在MySQL的未来版本中可能会被删除。JSON_MERGE()JSON_MERGE_PRESERVE()
有关更多信息和示例,请参见第 12.18.4 节 “修改 JSON 值的函数”。
实现了重复密钥的“最后一个重复密钥获胜”规范化,与RFC 7159和大多数JavaScript解析器一致。此处显示了此行为的示例,其中仅保留具有密钥的最右侧的成员:x
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不兼容的更改,在这种情况下,使用“第一个重复密钥获胜”算法。
有关详细信息和示例,请参阅 JSON 值的规范化、合并和自动包装。
在 MySQL 8.0.4 中添加了JSON_TABLE() 函数。此函数接受 JSON 数据并将其作为具有指定列的关系表返回。
此函数具有 语法 ,其中 expr 是返回 JSON 数据的表达式,path 是应用于源的 JSON 路径,column_list是列定义的列表。下面显示了一个示例:JSON_TABLE(expr, path COLUMNS column_list) [AS] alias)
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_EXTRACT(t1、data,“$.post.comments”)。有关更多信息,请参见第 12.18.6 节 “JSON 表函数”。
数据类型支持。 MySQL现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为 BLOB、文本 和 JSON 数据类型的默认值,以前根本无法为它们分配默认值。有关细节,请参见第 11.6 节 “数据类型缺省值”。GEOMETRY
优化。 添加了以下优化器增强功能:
我的学习模式现在支持不可见的索引。优化程序根本不使用不可见索引,而是以其他方式正常维护。默认情况下,索引可见。使用不可见索引可以测试删除索引对查询性能的影响,而无需进行破坏性更改,如果索引被证明是必需的,则必须撤消该更改。请参见第 8.3.12 节 “不可见索引”。
MySQL现在支持降序索引:在索引定义中不再被忽略,而是导致按降序存储键值。以前,可以按相反的顺序扫描索引,但会降低性能。降序索引可以按正向顺序扫描,这样效率更高。降序索引还使优化程序能够在最有效的扫描顺序混合某些列的升序和其他列的降序时使用多列索引。请参见第 8.3.13 节 “降序索引”。DESC
MySQL现在支持创建功能索引关键部分,这些部分索引表达式值而不是列值。功能关键部分支持对无法以其他方式编制索引的值(如 JSON 值)进行索引。有关细节,请参见第 13.1.15 节 “创建索引语句”。
在MySQL 8.0.14及更高版本中,由常量文字表达式引起的琐碎条件在准备过程中被删除,而不是在以后的优化过程中被删除。在流程的早期删除条件可以简化具有简单条件的外连接(例如:WHERE
SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1
优化程序现在在准备过程中看到 0 = 1 始终是 false,从而产生冗余,并将其删除,留下以下内容:OR 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可以在优化时使用常量折叠来处理列和常量值之间的比较,其中常量超出范围或相对于列类型的范围边界,而不是在执行时对每行执行此操作。例如,给定一个包含列的表,优化程序可以重写一个条件,例如 to (并完全优化该条件) 或 到 。tTINYINT UNSIGNEDcWHERE c < 256WHERE 1WHERE c >= 255WHERE c = 255
有关更多信息,请参见第 8.2.1.14 节 “常量折叠优化”。
从MySQL 8.0.16开始,用于子查询的半连接优化现在也可以应用于子查询。此外,优化程序现在在附加到子查询的条件中去近似平凡相关的相等谓词,以便可以像处理子查询中的表达式一样处理它们;这适用于 和 子查询。INEXISTSWHEREINEXISTSIN
有关更多信息,请参见第 8.2.2.1 节 “使用半连接转换优化 IN 和 EXISTS 子查询谓词”。
从MySQL 8.0.17开始,服务器在内部重写任何不完整的SQL谓词(即具有以下形式的谓词,其中值是列名或常量表达式,并且不使用比较运算符),以便在上下文化阶段,因此查询解析器,查询优化器和查询执行器只需要使用完整的谓词。WHERE valueWHERE value <> 0
此更改的一个明显影响是,对于布尔值,EXPLAIN 输出现在显示 和 ,而不是 和 。truefalse10
此更改的另一个影响是,在 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 布尔值,如以下查询所示:truefalseIS TRUE
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_VALUE()来执行类型转换,如下所示:
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_VALUE返回的SQL数据类型,以这种方式比较SQL布尔上下文中的提取值。
在MySQL 8.0.17及更高版本中,条件在内部具有或被转换为反连接。(反联接将返回表中所有行,而表中没有与连接条件匹配的行。这将删除子查询,这可以加快查询执行速度,因为子查询的表现在在顶级上进行处理。WHERENOT IN (subquery)NOT EXISTS (subquery)
这类似于并重用了外部联接的现有 () 优化;请参阅解释额外信息。IS NULLNot exists
从MySQL 8.0.21开始,单表更新或删除语句现在可以在许多情况下使用半连接转换或子查询具体化。这适用于此处显示的表单的语句:
UPDATE t1 SET t1.a=value WHERE t1.a IN (SELECT t2.a FROM t2)
DELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)
这可以对单个表或满足以下条件完成:UPDATEDELETE
or 语句使用具有 或 谓词的子查询。UPDATEDELETE[NOT] IN[NOT] EXISTS
该语句没有子句,也没有子句。ORDER BYLIMIT
(的多表版本 和 不支持 或 。UPDATEDELETEORDER BYLIMIT
目标表不支持先读后写删除(仅与NDB表相关)。
允许根据子查询中包含的任何提示和optimizer_switch的值进行半连接或子查询具体化。
当半联接优化用于符合条件的单表 或 时,这在优化程序跟踪中可见:对于多表语句,跟踪中有一个对象,而对于单表语句则没有对象。转换也可见于 或 解释分析 的输出中;单表语句显示,而多表语句报告完整计划。DELETEUPDATEjoin_optimizationEXPLAIN FORMAT=TREE
同样从MySQL 8.0.21开始,使用InnoDB表的多表语句支持半一致性读取,用于比可重复读取弱的事务隔离级别。UPDATE
改进了哈希联接性能。 MySQL 8.0.23重新实现了用于哈希连接的哈希表,从而在哈希连接性能方面进行了多项改进。这项工作包括对一个问题(错误#31516149,错误#99933)的修复,即分配给连接缓冲区(join_buffer_size)的内存实际上只能由哈希连接使用。
新的哈希表通常比旧哈希表快,并且在对齐、键/值以及有许多相等键的情况下使用较少的内存。此外,当哈希表的大小增加时,服务器现在可以释放旧内存。
公用表表达式。 MySQL现在支持通用表表达式,包括非递归和递归表达式。公用表表达式允许使用命名的临时结果集,通过允许在 SELECT 语句和某些其他语句之前使用 WITH 子句来实现。有关详细信息,请参见第 13.2.15 节 “WITH(公用表表达式)”。
从 MySQL 8.0.19 开始,递归公用表表达式 (CTE) 的递归 SELECT 部分支持子句。 也支持 与。有关更多信息,请参见递归公用表表达式。LIMITLIMITOFFSET
窗口函数。 MySQL现在支持窗口函数,对于查询中的每一行,使用与该行相关的行执行计算。其中包括诸如排名 ()、LAG() 和 NTILE() 之类的函数。此外,现在可以将几个现有的聚合函数用作窗口函数(例如,SUM() 和 AVG())) 。有关详细信息,请参见第 12.21 节 “窗口函数”。
横向派生表。 现在,派生表前面可以加上关键字,以指定允许在同一子句中引用(依赖于)前面表的列。横向派生表使某些 SQL 操作成为可能,这些操作无法使用非侧面派生表完成,或者需要效率较低的解决方法。请参见第 13.2.11.9 节 “横向派生表”。LATERALFROM
单表删除语句中的别名。 在MySQL 8.0.16及更高版本中,单表删除语句支持使用表别名。
正则表达式支持。 以前,MySQL使用亨利斯宾塞正则表达式库来支持正则表达式运算符(正则表达式,RLIKE)。正则表达式支持已使用国际统一码组件 (ICU) 重新实现,它提供了完整的 Unicode 支持,并且多字节安全。REGEXP_LIKE() 函数以 REGEXP 和 RLIKE 运算符的方式执行正则表达式匹配,这些运算符现在是该函数的同义词。此外,REGEXP_INSTR()、REGEXP_REPLACE() 和 REGEXP_SUBSTR() 函数可用于分别查找匹配位置并执行子字符串替换和提取。regexp_stack_limit和regexp_time_limit系统变量提供对匹配引擎的资源消耗的控制。有关详细信息,请参见第 12.8.2 节 “正则表达式”。有关使用正则表达式的应用程序可能受到实现更改影响的方式的信息,请参阅正则表达式兼容性注意事项。
内部临时表。 存储引擎将存储引擎替换为内存中内部临时表的默认引擎。存储引擎为 VARCHAR 和 VARBINARY 列提供高效存储。internal_tmp_mem_storage_engine会话变量定义内存中内部临时表的存储引擎。允许的值为 (默认值) 和 。temptable_max_ram变量定义在数据存储到磁盘之前存储引擎可以使用的最大内存量。TempTableMEMORYTempTableTempTableMEMORYTempTable
伐木。 添加了这些增强功能以改进日志记录:
错误日志记录已重写为使用 MySQL 组件体系结构。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录是作为可加载组件实现的。此外,还提供了可加载的 JSON 日志编写器。有关详细信息,请参见第 5.4.2 节 “错误日志”。
从MySQL 8.0.30开始,错误日志组件可以在存储引擎可用之前在启动时隐式加载。这种加载错误日志组件的新方法加载并启用由log_error_services变量定义的组件。InnoDB
以前,必须首先使用 INSTALL COMPONENT 安装错误日志组件,并且只能在完全可用后加载,因为要加载的组件列表是从表(即表)中读取的。InnoDBmysql.componentsInnoDB
隐式加载错误日志组件具有以下优点:
日志组件在启动序列的早期阶段加载,使记录的信息更快可用。
它有助于避免在启动期间发生故障时丢失缓冲的日志信息。
不需要使用安装组件加载日志组件,从而简化了错误日志配置。
对于向后兼容性,仍然支持使用加载日志组件的显式方法。INSTALL COMPONENT
有关更多信息,请参见第 5.4.2.1 节 “错误日志配置”。
备份锁定。 一种新型的备份锁允许在联机备份期间使用 DML,同时防止可能导致快照不一致的操作。新的备份锁受“用于备份的锁定实例”和“解锁实例”语法的支持。使用这些语句需要BACKUP_ADMIN权限。
复制。 对 MySQL 复制进行了以下增强:
MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,从而节省了日志中的空间,而不是记录完整的JSON文档。当使用基于语句的日志记录时,会自动完成此类压缩日志记录,并且可以通过将新系统变量设置为 来启用。有关更多信息,请参阅 JSON 值的部分更新以及binlog_row_value_options的说明。binlog_row_value_optionsPARTIAL_JSON
连接管理。 MySQL服务器现在允许专门为管理连接配置TCP / IP端口。这为用于普通连接的网络接口上允许的单个管理连接提供了一种替代方法,即使已经建立了max_connections连接也是如此。请参见第 5.1.12.1 节 “连接接口”。
MySQL现在提供了对压缩使用的更多控制,以最大限度地减少通过连接到服务器发送的字节数。以前,给定的连接要么是未压缩的,要么是使用压缩算法的。现在,也可以使用该算法,并为连接选择压缩级别。允许的压缩算法可以在服务器端配置,也可以在连接发起端配置,以便客户端程序和参与源/副本复制或组复制的服务器进行连接。有关详细信息,请参见第 4.2.8 节 “连接压缩控制”。zlibzstdzstd
配置。 整个MySQL中允许的主机名的最大长度已从之前的60个字符限制提高到255个ASCII字符。例如,这适用于数据字典、系统架构、性能架构和架构中与主机名相关的列。将主语句更改为的值;显示进程列表语句输出中的列;账户名称中的主机名(例如在账户管理报表和属性中使用的主机名);以及与主机名相关的命令选项和系统变量。mysqlINFORMATION_SCHEMAsysMASTER_HOSTHostDEFINER
警告:
允许的主机名长度的增加可能会影响在主机名列上具有索引的表。例如,系统架构中为主机名编制索引的表现在具有显式属性 ,以适应较长的索引值。mysqlROW_FORMATDYNAMIC
某些文件名值配置设置可能基于服务器主机名构造。允许的值受基础操作系统的约束,基础操作系统可能不允许文件名长到足以包含 255 个字符的主机名。这会影响系统变量和相应选项general_log_file、log_error、pid_file、relay_log和slow_query_log_file。如果基于主机名的值对于操作系统来说太长,则必须提供显式的较短值。
尽管服务器现在支持 255 个字符的主机名,但使用 --ssl-mode=VERIFY_IDENTITY 选项建立的与服务器的连接受 OpenSSL 支持的最大主机名长度的约束。主机名匹配项与 SSL 证书的两个字段有关,其最大长度如下:公用名:最大长度 64;主题备用名称:根据 RFC#1034 的最大长度。
插件。 以前,MySQL插件可以用C或C++编写。插件使用的MySQL头文件现在包含C++代码,这意味着插件必须用C++编写,而不是C。
C 接口。 MySQL C API 现在支持与 MySQL 服务器进行非阻塞通信的异步函数。每个函数都是现有同步函数的异步对应项。同步函数块如果读取或写入服务器连接必须等待。异步函数使应用程序能够检查服务器连接上的工作是否已准备好继续。如果没有,应用程序可以执行其他工作,然后再进行检查。请参见 C API 异步接口。
用于强制转换的其他目标类型。 函数 CAST() 和转换() 现在支持转换为双精度型、浮点型和实数型。在 8.0.17 中新增功能。请参见第 12.11 节 “转换函数和运算符”。
JSON 架构验证。 MySQL 8.0.17添加了两个函数JSON_SCHEMA_VALID()和JSON_SCHEMA_VALIDATION_REPORT()来再次验证 JSON 文档 JSON 架构。 如果文档针对架构进行验证,则返回 TRUE (1),如果不进行验证,则返回 FALSE (0)。 返回一个 JSON 文档,其中包含有关验证结果的详细信息。以下语句适用于这两个函数:JSON_SCHEMA_VALID()JSON_SCHEMA_VALIDATION_REPORT()
架构必须符合 JSON 架构规范的草稿 4。
required支持属性。
不支持外部资源和关键字。$ref
支持正则表达式模式;无效模式将被静默忽略。
有关更多信息和示例,请参见第 12.18.7 节 “JSON 模式验证函数”。
多值索引。 从MySQL 8.0.17开始,InnoDB支持创建多值索引,该索引是在JSON列上定义的二级索引,用于存储值数组,并且可以为单个数据记录提供多个索引记录。此类索引使用关键部件定义,如 。MySQL优化器会自动将多值索引用于合适的查询,可以在EX EXPLAIN的输出中查看。CAST(data->'$.zipcode' AS UNSIGNED ARRAY)
作为这项工作的一部分,MySQL添加了一个JSON_OVERLAPS()的新函数和一个新的成员OF()运算符来处理JSON文档,另外使用新的关键字扩展了CAST()函数,如下面的列表所述:ARRAY
JSON_OVERLAPS()比较两个 JSON 文档。如果它们包含任何共同的键值对或数组元素,则该函数返回 TRUE (1);否则,它将返回错误 (0)。如果两个值都是标量,则该函数将执行简单的相等性检验。如果一个参数是 JSON 数组,另一个参数是标量,则标量被视为数组元素。因此, 充当 JSON_CONTAINS() 的补充。JSON_OVERLAPS()
MEMBER OF()测试第一个操作数(标量或 JSON 文档)是否是作为第二个操作数传递的 JSON 数组的成员,如果是,则返回 TRUE (1),如果不是,则返回 FALSE (0)。不执行操作数的类型转换。
CAST(通过将位于 expression AS type ARRAY)json_path 处的 JSON 文档中的 JSON 数组转换为 SQL 数组,允许创建功能索引。类型说明符仅限于 已支持的类型说明符,但 (不支持)除外。只有 InnoDB 支持这种用法(和关键字),并且仅用于创建多值索引。CAST()BINARYCAST()ARRAY
有关多值索引的详细信息(包括示例),请参阅多值索引。第 12.18.3 节 “搜索 JSON 值的函数”提供了有关 和 的信息以及使用示例。JSON_OVERLAPS()MEMBER OF()
暗示time_zone。 从MySQL 8.0.17开始,time_zone会话变量可以使用SET_VAR进行提示。
重做日志存档。 从MySQL 8.0.17开始,支持重做日志存档。在备份操作进行时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,从而导致重做日志记录因被覆盖而丢失。重做日志存档功能通过将重做日志记录按顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件中复制重做日志记录,从而避免潜在的数据丢失。有关详细信息,请参阅重做日志存档。InnoDB
克隆插件。 从MySQL 8.0.17开始,MySQL提供了一个克隆插件,允许在本地或从远程MySQL服务器实例克隆数据。本地克隆操作将克隆数据存储在运行MySQL实例的同一服务器或节点上。远程克隆操作通过网络将克隆数据从捐赠者MySQL服务器实例传输到启动克隆操作的接收服务器或节点。InnoDB
克隆插件支持复制。除了克隆数据之外,克隆操作还会从供体中提取并传输复制坐标,并将其应用于受者,从而可以使用克隆插件置备组复制成员和副本。使用克隆插件进行置备比复制大量事务要快得多,效率也高得多。组复制成员也可以配置为使用克隆插件作为替代恢复方法,以便成员自动选择最有效的方式从种子成员检索组数据。
有关更多信息,请参见第 5.6.7 节 “克隆插件”和第 18.5.4.2 节 “为分布式恢复而克隆”。
从MySQL 8.0.27开始,在克隆操作正在进行时,允许在捐赠者MySQL服务器实例上执行并发DDL操作。以前,在克隆操作期间会保留备份锁,从而阻止供体上的并发 DDL。要恢复到在克隆操作期间阻止供体上的并发 DDL 的先前行为,请启用clone_block_ddl变量。请参见第 5.6.7.4 节 “克隆和并发 DDL”。
从MySQL 8.0.29开始,clone_delay_after_data_drop变量允许在远程克隆操作开始时删除接收者MySQL服务器实例上的现有数据后立即指定延迟期。延迟旨在为接收主机上的文件系统提供足够的时间,以便在从捐赠者MySQL服务器实例克隆数据之前释放空间。某些文件系统在后台进程中异步释放空间。在这些文件系统上,在删除现有数据后过早克隆数据可能会导致克隆操作由于空间不足而失败。最大延迟期为 3600 秒(1 小时)。默认设置为 0(无延迟)。
哈希联接优化。 从MySQL 8.0.18开始,每当连接中的每对表包含至少一个等值连接条件并且任何连接条件都没有索引时,就会使用哈希连接。哈希联接不需要索引,尽管它可以与仅适用于单表谓词的索引一起使用。在大多数情况下,哈希联接比块嵌套循环算法更有效。可以通过以下方式优化如下所示的连接:
SELECT *- FROM t1
- JOIN t2
- ON t1.c1=t2.c1;
-
- SELECT *
- FROM t1
- JOIN t2
- ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2)
- JOIN t3
- ON (t2.c1 = t3.c1)
哈希连接也可用于笛卡尔积,即在未指定连接条件时。
您可以使用“解释格式=树”或“解释分析”查看哈希联接优化何时用于特定查询。(在MySQL 8.0.20及更高版本中,您也可以使用 省略。EXPLAINFORMAT=TREE
可用于哈希联接的内存量受 join_buffer_size 的值限制。在磁盘上执行需要超过此数量的内存的哈希联接;磁盘上的哈希联接可以使用的磁盘文件数受 open_files_limit的限制。
从MySQL 8.0.19开始,MySQL 8.0.18中引入的hash_join优化器开关不再受支持(hash_join=on仍然显示为optimizer_switch值的一部分,但设置它不再有任何影响)。HASH_JOIN和优化程序提示也不再受支持。开关和提示现在都已弃用;预计它们将在将来的MySQL版本中被删除。在MySQL 8.0.18及更高版本中,可以使用NO_BNL优化器开关禁用哈希联接。NO_HASH_JOIN
在MySQL 8.0.20及更高版本中,MySQL服务器中不再使用块嵌套循环,并且只要以前使用块嵌套循环,就会使用哈希连接,即使查询不包含等连接条件。这适用于内部非等连接、半连接、反连接、左外连接和右外连接。仍然支持optimizer_switch系统变量的block_nested_loop标志以及 BNL 和优化器提示,但从此以后只能控制哈希联接的使用。此外,内连接和外连接(包括半连接和反连接)现在都可以使用批处理键访问 (BKA),它以增量方式分配连接缓冲区内存,以便单个查询不需要使用它们实际上不需要的大量资源来解析。仅支持用于内部连接的 BKA 从 MySQL 8.0.18 开始。NO_BNL
MySQL 8.0.20还将以前版本的MySQL中使用的执行器替换为迭代器执行器。这项工作包括替换旧的索引子查询引擎,这些引擎控制那些尚未优化为半连接查询的查询的表单查询,以及以相同形式实现的查询,该查询以前依赖于旧的执行器。WHERE value IN (SELECT column FROM table WHERE ...)IN
有关更多信息和示例,请参见第 8.2.1.4 节 “哈希连接优化”。另请参见批处理密钥访问联接。
解释分析语句。 在MySQL 8.0.18中实现了解释语句的新形式解释分析,为处理查询时使用的每个迭代器提供了有关SELECT语句执行格式的扩展信息,并且可以将估计成本与查询的实际成本进行比较。此信息包括启动成本、总成本、此迭代器返回的行数以及执行的循环数。TREE
在MySQL 8.0.21及更高版本中,此语句还支持说明符。 是唯一受支持的格式。FORMAT=TREETREE
有关详细信息,请参阅使用“分析解释”获取信息。
查询强制转换注入。 在版本8.0.18及更高版本中,MySQL将转换操作注入到查询项树中的表达式和条件中,其中参数的数据类型与预期的数据类型不匹配。这对查询结果或执行速度没有影响,但使执行的查询等效于符合SQL标准的查询,同时保持与以前版本的MySQL的向后兼容性。
这种隐式转换现在在时间类型(日期,日期时间,时间戳,时间)和数字类型(小,小,中,整数,比金特;(二元)之间执行。十进制/数字;浮动,双重,真实;位)每当使用任何标准数值比较运算符(=、>=、>、<、<=、<>/!=或 <=>)进行比较时。 在这种情况下,任何尚未成为 的值都将强制转换为 1。现在还执行强制转换注入,用于比较 DATE 或 TIME 值与 DATETIME 值,其中参数在必要时强制转换为 。DOUBLEDATETIME
从MySQL 8.0.21开始,在将字符串类型与其他类型进行比较时也会执行此类强制转换。强制转换的字符串类型包括字符、变量、二进制、变量、BLOB、文本、枚举和 SET。将字符串类型的值与数字类型 或 进行比较时,字符串强制转换为 ;如果另一个参数的类型不是 、 或 ,它也被转换为 。将字符串类型与 或 值进行比较时,字符串的强制转换为 ;将字符串类型与 进行比较时,字符串将转换为 。YEARDOUBLEFLOATDOUBLEREALDOUBLEDATETIMETIMESTAMPDATETIMEDATEDATE
通过查看 EXPLAIN ANALYZE 的输出,或者,如下所示,可以查看何时将强制转换注入到给定查询中:EXPLAIN FORMAT=JSONEXPLAIN FORMAT=TREE
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)
这样的转换也可以通过执行来看到,在这种情况下,还需要在执行语句后发出 SHOW 警告。EXPLAIN [FORMAT=TRADITIONAL]EXPLAIN
时间戳和日期时间的时区支持。 从MySQL 8.0.19开始,服务器接受插入的日期时间(时间戳和日期时间)值的时区偏移量。此偏移量使用的格式与设置time_zone系统变量时使用的格式相同,不同之处在于,当偏移量的小时部分小于 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'
选择日期时间值时不显示时区偏移量。
包含时区偏移量的日期时间文本可用作预准备语句参数值。
作为这项工作的一部分,用于设置time_zone系统变量的值现在也被限制为 ,包括 。(如果加载了 MySQL 时区表,仍然可以将名称值分配给 ,例如 、 和 此变量,请参阅填充时区表)。-13:59+14:00time_zone'EST''Posix/Australia/Brisbane''Europe/Stockholm'
有关更多信息和示例,请参见第 5.1.15 节 “MySQL 服务器时区支持”,以及第 11.2.2 节 “日期、日期时间和时间戳类型”。
有关 JSON 架构检查约束失败的精确信息。 当使用JSON_SCHEMA_VALID()指定约束时,MySQL 8.0.19及更高版本提供了有关此类约束失败原因的精确信息。CHECK
有关示例和详细信息,请参阅JSON_SCHEMA_VALID() 和 CHECK 约束。另请参见第 13.1.20.6 节 “检查约束”。
具有重复键更新的行和列别名。 从MySQL 8.0.19开始,可以使用别名引用要插入的行,也可以选择引用其列。请考虑以下 INSERT 语句,该语句位于具有列和 的表上:tab
INSERT INTO t SET a=9,b=5- ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);
使用新行的别名,在某些情况下,使用别名和此行的列,可以通过许多不同的方式重写语句,如下所示:newmnINSERT
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中作为表语句和值语句实现。
TABLE 语句的格式为 ,等效于 。它支持 和 子句(后者具有可选功能),但不允许选择单个表列。 可以在任何使用等效 SELECT 语句的地方使用;这包括连接,并集,插入...选择、替换、创建表...SELECT 语句和子查询。例如:TABLE table_nameSELECT * FROM table_nameORDER BYLIMITOFFSETTABLE
TABLE t1 UNION TABLE t2等效于SELECT * FROM t1 UNION SELECT * FROM t2
CREATE TABLE t2 TABLE t1等效于CREATE TABLE t2 SELECT * FROM t1
SELECT a FROM t1 WHERE b > ANY (TABLE t2)等效于 。SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)
VALUES 可用于向 INSERT、REPLACE 或 SELECT 语句提供表值,它由关键字后跟一系列用逗号分隔的行构造函数 () 组成。例如,该语句提供了与特定于 MySQL 的 符合 SQL 标准的等效项。您还可以像选择表一样从 VALUES 表值构造函数中进行选择,请记住,在执行此操作时必须提供表别名,并像使用其他任何表一样使用此 SELECT;这包括联接、联合和子查询。VALUESROW()INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9)INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9)
有关 和 的详细信息及其用法示例,请参阅本文档的以下部分:TABLEVALUES
优化器提示强制索引,忽略索引。 MySQL 8.0引入了索引级优化器提示,可类似于第8.9.4节“索引提示”中所述的传统索引提示。此处列出了新提示及其等效提示:FORCE INDEXIGNORE INDEX
GROUP_INDEX:相当于FORCE INDEX FOR GROUP BY
NO_GROUP_INDEX:相当于IGNORE INDEX FOR GROUP BY
JOIN_INDEX:相当于FORCE INDEX FOR JOIN
NO_JOIN_INDEX:相当于IGNORE INDEX FOR JOIN
ORDER_INDEX:相当于FORCE INDEX FOR ORDER BY
NO_ORDER_INDEX:相当于IGNORE INDEX FOR ORDER BY
索引:与GROUP_INDEX加JOIN_INDEX加ORDER_INDEX相同;等效于没有修饰符FORCE INDEX
NO_INDEX:与NO_GROUP_INDEX加NO_JOIN_INDEX加NO_ORDER_INDEX相同;等效于没有修饰符IGNORE INDEX
例如,以下两个查询是等效的:
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 中删除。它们不实现 单个完全等效的 ;相反,您可以使用一个或多个NO_INDEX,NO_JOIN_INDEX,NO_GROUP_INDEX或NO_ORDER_INDEX来实现相同的效果。FORCE INDEXIGNORE INDEXUSE INDEX
有关详细信息和使用示例,请参阅索引级优化器提示。
JSON_VALUE() 函数。 MySQL 8.0.21实现了一个新功能JSON_VALUE(),旨在简化JSON列的索引。在其最基本的形式中,它将 JSON 文档和指向该文档中单个值的 JSON 路径作为参数,以及(可选)允许您使用关键字指定返回类型。 等效于此:RETURNINGJSON_VALUE(json_doc, path RETURNING type)
CAST(- JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) )
- AS type
- );
您还可以指定 、 或 两个子句,类似于 JSON_TABLE() 中使用的子句。ON EMPTYON ERROR
您可以使用 在列上的表达式上创建索引,如下所示:JSON_VALUE()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_VALUE()的说明。
用户注释和用户属性。 MySQL 8.0.21引入了在创建或更新用户帐户时设置用户注释和用户属性的功能。用户注释由作为参数传递给与“创建用户”或“ALTER 用户”语句一起使用的子句的任意文本组成。user 属性由 JSON 对象形式的数据组成,该 JSON 对象作为参数传递给与这两个语句中的任何一个一起使用的子句。该属性可以包含 JSON 对象表示法中的任何有效键值对。只能将 或 中的一个 用于单个 或 语句。COMMENTATTRIBUTECOMMENTATTRIBUTECREATE USERALTER USER
用户注释和用户属性作为 JSON 对象在内部一起存储,注释文本作为元素的值作为其键。可以从INFORMATION_SCHEMA列中检索此信息。USER_ATTRIBUTES表;由于它是 JSON 格式,您可以使用 MySQL 的 JSON 函数和运算符来解析其内容(请参见第 12.18 节 “JSON 函数”)。对 user 属性的连续更改将与其当前值合并,就像使用 JSON_MERGE_PATCH() 函数时一样。commentATTRIBUTE
例:
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 节 “ALTER 用户声明”和第 26.3.46 节 “INFORMATION_SCHEMA USER_ATTRIBUTES表”。
新的optimizer_switch标志。 MySQL 8.0.21为optimizer_switch系统变量添加了两个新标志,如以下列表所述:
默认情况下,每当优化程序确定这将加快执行速度时,MySQL就会尝试对具有子句的任何或查询使用有序索引。由于在某些情况下,为此类查询选择不同的优化实际上可能表现得更好,因此现在可以通过将 prefer_ordering_index 标志设置为 来禁用此优化。ORDER BYGROUP BYLIMIToff
此标志的默认值为 。on
当此标志设置为 时,优化程序将符合条件的标量子查询转换为派生表上的连接。例如,查询被重写为 。onSELECT * FROM t1 WHERE t1.a > (SELECT COUNT(a) FROM t2)SELECT t1.a FROM t1 JOIN ( SELECT COUNT(t2.a) AS c FROM t2 ) AS d WHERE t1.a > d.c
此优化可以应用于作为 、 、 或 子句一部分的子查询;包含一个或多个聚合函数,但没有子句;不相关;并且不使用任何非确定性函数。SELECTWHEREJOINHAVINGGROUP BY
优化也可以应用于表子查询,该子查询是 、 、 或 的参数,并且不包含 。例如,查询被重写为 。INNOT INEXISTSNOT EXISTSGROUP BYSELECT * FROM t1 WHERE t1.b < 0 OR t1.a IN (SELECT t2.a + 1 FROM t2)SELECT a, b FROM t1 LEFT JOIN (SELECT DISTINCT 1 AS e1, t2.a AS e2 FROM t2) d ON t1.a + 1 = d.e2 WHERE t1.b < 0 OR d.e1 IS NOT NULL
从MySQL 8.0.24开始,这种优化也可以应用于相关的标量子查询,方法是对其应用额外的分组,然后在提升的谓词上应用外部连接。例如,查询(如 )可以重写为 。MySQL执行基数检查,以确保子查询不会返回多行(ER_SUBQUERY_NO_1_ROW)。有关更多信息,请参见第 13.2.11.7 节 “相关子查询”。SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a) > 0SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a = derived.a WHERE derived.a > 0
这种优化通常是禁用的,因为它在大多数情况下不会产生明显的性能优势。默认情况下,该标志设置为 。off
有关更多信息,请参见第 8.9.2 节 “可切换优化”。另请参见第 8.2.1.19 节 “LIMIT 查询优化”、第 8.2.2.1 节 “使用半连接转换优化 IN 和 EXISTS 子查询谓词”和第 8.2.2.4 节 “通过合并或具体化优化派生表、视图引用和公用表表达式”。
XML 增强功能。 从 MySQL 8.0.21 开始,LOAD XML 语句现在支持要导入的 XML 中的部分。CDATA
现在支持转换为 YEAR 类型。 从MySQL 8.0.22开始,服务器允许转换为年份。CAST() 和 CONVERT() 函数都支持一位数、两位数和四位数的值。对于一位数和两位数的值,允许的范围是 0-99。四位数值必须在 1901-2155 范围内。 也可以用作JSON_VALUE()函数的返回类型;此函数仅支持四位数年份。YEARYEAR
字符串、时间和日期以及浮点值都可以转换为 。不支持将几何图形值转换为 。YEARYEAR
有关详细信息(包括转换规则),请参阅 CONVERT() 函数的说明。
将时间戳值检索为 UTC。 MySQL 8.0.22 及更高版本支持在检索时使用 将时间戳列值从系统时区转换为 UTC DATETIME,其中说明符是 或 之一。如果需要,可以指定由强制转换返回的值的精度,最多可指定 6 位小数。此构造不支持该关键字。CAST(value AT TIME ZONE specifier AS DATETIME)[INTERVAL] '+00:00''UTC'DATETIMEARRAY
TIMESTAMP还支持使用时区偏移量插入到表中的值。不支持使用 转换() 或任何其他 MySQL 函数或构造。AT TIME ZONE
有关详细信息和示例,请参阅 CAST() 函数的说明。
转储文件输出同步。 MySQL 8.0.22及更高版本支持在通过选择进入转储文件和语句写入文件时定期同步。这可以通过将select_into_disk_sync系统变量设置为 ;写入缓冲区的大小由为select_into_buffer_size设置的值确定;默认值为 131072 (217) 字节。SELECT INTO OUTFILEON
此外,可以使用select_into_disk_sync_delay设置同步到磁盘后的可选延迟;默认值为无延迟(0 毫秒)。
有关详细信息,请参阅本项前面引用的变量的说明。
单一准备发言稿。 从MySQL 8.0.22开始,预准备语句准备一次,而不是每次执行一次。这是在执行准备时完成的。对于存储过程中的任何语句也是如此。该语句在首次执行存储过程时准备一次。
此更改的一个结果是,解析预准备语句中使用的动态参数的方式也按此处列出的方式进行了更改:
准备语句时,为预准备语句参数分配数据类型;对于语句的每次后续执行,类型都会保留(除非重新准备语句;见下文)。
在预准备语句中对给定参数或用户变量使用不同的数据类型,以便在第一次执行后执行该语句,这可能会导致语句被重新准备;因此,建议在重新执行预准备语句时对给定参数使用相同的数据类型。
为了与 SQL 标准保持一致,不再接受以下使用窗口函数的构造:
铅(expr, nn) 和 LAG(expr, nn),其中 nn 是负数
这有助于更好地遵守 SQL 标准。有关更多详细信息,请参阅各个函数的说明。
现在,在预准备语句中引用的用户变量的数据类型已确定为准备语句时。该类型对于语句的后续每次执行都将保留。
存储过程中出现的语句引用的用户变量现在具有首次执行语句时确定的数据类型;对于包含存储过程的任何后续调用,该类型将保持不变。
执行表单的预准备语句时,为参数传递整数值 N 不再导致按选择列表中的第 N个表达式对结果进行排序;结果不再像 预期的那样排序。SELECT expr1, expr2, ... FROM table ORDER BY ?ORDER BY constant
准备用作预准备语句或在存储过程中仅准备一次的语句可增强语句的性能,因为它消除了重复准备的额外成本。这样做还可以避免准备结构的可能多次回滚,这是MySQL中许多问题的根源。
有关更多信息,请参见第 13.5.1 节 “PREPARE 语句”。
右连接作为左连接处理。 从MySQL 8.0.22开始,服务器在内部处理所有实例,消除了许多在解析时未执行完整转换的特殊情况。RIGHT JOINLEFT JOIN
派生条件下推优化。 MySQL 8.0.22(及更高版本)为具有具体化派生表的查询实现派生条件下推。对于诸如 之类的查询,现在在许多情况下可以将外部条件向下推送到派生表,在这种情况下,会导致 。SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constantWHERESELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dt
以前,如果派生表被具体化而不是合并,MySQL将整个表具体化,然后使用条件限定行。使用派生的条件下推优化将条件移动到子查询中通常可以减少必须处理的行数,从而减少执行查询所需的时间。WHEREWHERE
当实例化派生表不使用任何聚合或窗口函数时,可以将外部条件直接推送到实例化派生表。当派生表具有 并且不使用任何窗口函数时,可以将外部条件作为条件向下推送到派生表。当派生表使用窗口函数和窗口函数子句中使用的外部引用列时,也可以下推该条件。WHEREGROUP BYWHEREHAVINGWHEREWHEREPARTITION
默认情况下,派生条件下推处于启用状态,如optimizer_switch系统变量的 derived_condition_pushdown 标志所示。在MySQL 8.0.22中添加的标志默认设置为;要禁用特定查询的优化,可以使用NO_DERIVED_CONDITION_PUSHDOWN优化器提示(也在MySQL 8.0.22中添加)。如果由于derived_condition_pushdown设置为 而禁用优化,则可以使用 DERIVED_CONDITION_PUSHDOWN 为给定查询启用优化。onoff
派生条件下推优化不能用于包含子句的派生表。在MySQL 8.0.29之前,当查询包含UNION时,也无法使用优化。在MySQL 8.0.29及更高版本中,在大多数情况下,条件可以向下推送到并集的两个查询块;有关更多信息,请参见第 8.2.2.5 节 “派生条件下推优化”。LIMIT
此外,不能将本身使用子查询的条件下推,也不能将条件向下推送到也是外连接的内部表的派生表。有关其他信息和示例,请参见第 8.2.2.5 节 “派生条件下推优化”。WHERE
在MySQL授权表上进行非锁定读取。 从MySQL 8.0.22开始,为了允许对MySQL授权表进行并发DML和DDL操作,以前在MySQL授权表上获取行锁的读取操作将作为非锁定读取执行。
现在在MySQL授权表上作为非锁定读取执行的操作包括:
SELECT 语句和其他只读语句,它们通过连接列表和子查询从授权表中读取数据,包括 SELECT ...对于 SHARE 语句,使用任何事务隔离级别。
使用任何事务隔离级别从授权表(通过联接列表或子查询)读取数据但不修改它们的 DML 操作。
有关其他信息,请参阅授予表并发性。
对 FROM_UNIXTIME()、UNIX_TIMESTAMP()、CONVERT_TZ() 的 64 位支持。 从MySQL 8.0.28开始,函数FROM_UNIXTIME()),UNIX_TIMESTAMP()和CONVERT_TZ()在支持它们的平台上处理64位值。这包括 64 位版本的 Linux、MacOS 和视窗。
在兼容的平台上,现在处理高达UTC的值,并且可以转换自Unix Epoch以来高达32536771199.999999秒的值; 现在接受转换后不超过 UTC 的值。UNIX_TIMESTAMP()'3001-01-18 23:59:59.999999'FROM_UNIXTIME()CONVERT_TZ()'3001-01-18 23:59:59.999999'
这些函数在 32 位平台上的行为不受这些更改的影响。时间戳类型的行为也不受影响(在任何平台上);要处理之后的日期时间,请改用日期时间类型。'2038-01-19 03:14:07.999999'
有关更多信息,请参见第 12.7 节 “日期和时间函数”中刚刚讨论的各个函数的说明。
资源分配控制。 从MySQL 8.0.28开始,您可以通过检查Global_connection_memory状态变量来查看所有常规用户发出的查询所使用的内存量。(此总数不包括系统用户(如MySQL根)使用的资源。它也不包括 InnoDB 缓冲池占用的任何内存。
要启用 的更新,必须设置 global_connection_memory_tracking = 1;默认情况下,这是(关闭)。您可以通过设置connection_memory_chunk_size来控制更新频率。Global_connection_memory0Global_connection_memory
还可以通过设置此处列出的系统变量之一或两个,在会话和/或全局级别为普通用户设置内存使用限制:
connection_memory_limit:为每个连接分配的内存量。每当任何用户超出此限制时,都会拒绝来自此用户的新查询。
global_connection_memory_limit:为所有连接分配的内存量。每当超过此限制时,任何常规用户的新查询都将被拒绝。
这些限制不适用于系统进程或管理帐户。
有关详细信息,请参阅引用变量的说明。
分离的 XA 事务。 MySQL 8.0.29增加了对XA事务的支持,这些事务一旦准备就绪,就不再连接到原始连接。这意味着它们可以由另一个连接提交或回滚,并且当前会话可以立即开始另一个事务。
系统变量xa_detach_on_prepare控制 XA 事务是否分离;默认值为 ,这将导致所有 XA 事务被分离。如果临时表生效,则不允许对 XA 事务使用临时表。ON
有关更多信息,请参见第 13.3.8.2 节 “XA 事务状态”。
自动二进制日志清除控制。 MySQL 8.0.29添加了binlog_expire_logs_auto_purge系统变量,该变量提供了用于启用和禁用二进制日志自动清除的单一界面。默认情况下启用 ();要禁用二进制日志文件的自动清除,请将此变量设置为 。ONOFF
binlog_expire_logs_auto_purge必须为了自动清除二进制日志文件才能继续;此变量的值优先于任何其他服务器选项或变量的值,包括(但不限于)binlog_expire_logs_seconds。ON
的设置对清除二进制日志没有影响。binlog_expire_logs_auto_purge
条件例程和触发器创建语句。 从MySQL 8.0.29开始,以下语句支持一个选项:IF NOT EXISTS
对于在创建存储函数 和 时,如果已经存在具有相同名称的例程,则此选项可防止发生错误。对于用于创建可加载函数的 CREATE 函数,如果已存在具有该名称的可加载函数,则该选项可防止出错。对于 ,如果同一架构中已存在具有相同名称的触发器,则该选项可防止发生错误。CREATE FUNCTIONCREATE PROCEDURECREATE TRIGGER
此增强功能使这些语句的语法与“创建数据库”、“创建表”、“创建用户”和“创建事件”(所有这些语句都已支持)的语法更加一致,并用于补充 DROP 过程、DROP 函数和删除触发器语句支持的选项。IF NOT EXISTSIF EXISTS
有关详细信息,请参阅指示的 SQL 语句的说明以及函数名称解析。另请参见第 17.5.1.7 节 “创建表的复制...选择语句“。
包括 FIDO 库升级。 MySQL 8.0.30将包含的库(与插件一起使用)从1.5.0版本升级到1.8.0版本。fido2authentication_fido
字符集:特定于语言的排序规则。 以前,当多种语言具有完全相同的排序规则定义时,MySQL仅为其中一种语言实现了排序规则,这意味着某些语言仅由特定于其他语言的Unicode 9.0排序规则覆盖。MySQL 8.0.30(及更高版本)通过为那些以前仅由其他语言的语言特定排序规则涵盖的语言提供特定于语言的排序规则来修复此类问题。下面列出了新排序规则所涵盖的语言:utf8mb4
挪威语 (尼诺斯克)
和
挪威语(博克马尔语)
塞尔维亚语(拉丁字符)
波斯尼亚语(拉丁字符)
保加利亚语
加利西亚语
蒙古语(西里尔字符)
MySQL为刚刚列出的每种语言提供和排序规则。*_as_cs*_ai_ci
有关详细信息,请参阅特定于语言的排序规则。
如果存在,请忽略“未知用户”选项以进行撤销。 MySQL 8.0.30为PISTER实现了两个新选项,可用于确定当找不到或无法分配语句中指定的用户,角色或特权时,语句是否产生错误或警告。此处提供了显示这些新选项位置的非常基本的语法:
REVOKE [IF EXISTS] privilege_or_role - ON object
- FROM user_or_role [IGNORE UNKNOWN USER]
IF EXISTS只要指定的目标用户或角色确实存在,就会导致不成功的语句引发警告而不是错误,尽管语句中引用了找不到的任何角色或特权。REVOKE
IGNORE UNKNOWN USER当找不到语句中指定的目标用户或角色时,会导致不成功的 REVOKE 引发警告而不是错误。
有关更多信息和示例,请参见第 13.7.1.8 节 “REVOKE 语句”。
生成不可见的主键。 从MySQL 8.0.30开始,可以在GIPK模式下运行复制源服务器,这会导致生成的不可见主键(GIPK)被添加到没有显式主键创建的任何InnoDB表中。添加到此类表中的生成的键列定义等效于此处所示的内容:
my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY
默认情况下不启用 GIPK 模式。要启用它,请将sql_generate_invisible_primary_key服务器系统变量设置为 。ON
副本将忽略复制表的任何设置,并且不会为未在源上使用它们创建的任何表生成主键。sql_generate_invisible_primary_key
生成的不可见主键通常可见于语句的输出中,例如“显示创建表”和“显示索引”,以及 MySQL 信息架构表(如列和统计信息表)。在这种情况下,您可以通过将 show_gipk_in_create_table_and_information_schema 设置为 来隐藏它们。OFF
作为这项工作的一部分,向 mysqldump 和 mysqlpump 添加了一个新选项,以从其输出中排除生成的不可见主键、列和列值。--skip-generated-invisible-primary-key
有关更多信息和示例,请参见第 13.1.20.11 节 “生成的不可见主键”。
崩溃安全的 XA 事务。 以前,XA 事务不能完全恢复二进制日志的意外停止,如果发生这种情况是服务器执行 XA PREPARE 或 ,则不能保证服务器可恢复到正确的状态,可能使二进制日志中缺少尚未应用的额外 XA 事务,或者缺少一个或多个已应用的 XA 事务。从MySQL 8.0.30开始,这不再是一个问题,并且无论出于何种原因从复制拓扑中退出的服务器在重新加入时始终可以恢复到一致的XA事务状态。XA COMMITXA ROLLBACK
已知问题:当使用同一事务 XID 按顺序执行 XA 事务,并且在执行 期间发生中断,则在存储引擎中准备此事务后,可能无法再同步二进制日志和存储引擎之间的状态。XA COMMIT ... ONE PHASE
有关更多信息,请参见第 13.3.8.3 节 “对 XA 事务的限制”。
嵌套与联合。 从MySQL 8.0.31开始,括号中的查询表达式的主体可以与UNION一起嵌套到63个级别的深度。此类查询以前被拒绝并出现错误ER_NOT_SUPPORTED_YET,但现在已允许。此类查询的 EXPLAIN 输出如下所示:
mysql> EXPLAIN FORMAT=TREE ( - -> (SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
- -> ) ORDER BY c LIMIT 1\G
- *************************** 1. row ***************************
- EXPLAIN: -> Limit: 1 row(s) (cost=5.55..5.55 rows=1)
- -> Sort: c, limit input to 1 row(s) per chunk (cost=2.50 rows=0)
- -> Table scan on <result temporary> (cost=2.50 rows=0)
- -> Temporary table (cost=5.55..5.55 rows=1)
- -> Limit: 2 row(s) (cost=2.95..2.95 rows=1)
- -> Sort: b, limit input to 2 row(s) per chunk (cost=2.50 rows=0)
- -> Table scan on <result temporary> (cost=2.50 rows=0)
- -> Temporary table (cost=2.95..2.95 rows=1)
- -> Limit: 3 row(s) (cost=0.35 rows=1)
- -> Sort: t.a, limit input to 3 row(s) per chunk (cost=0.35 rows=1)
- -> Table scan on t (cost=0.35 rows=1)
-
- 1 row in set (0.00 sec)
在折叠括号查询表达式的主体时,MySQL遵循SQL标准语义,因此较高的外部限制不能覆盖内部下限。例如, 可以返回不超过五行。(SELECT ... LIMIT 5) LIMIT 10
只有在MySQL优化器的解析器执行了任何简化或合并之后,才会施加63级限制。
有关更多信息,请参见第 13.2.10.4 节 “括号内的查询表达式”。
禁用查询重写。 以前,在使用插件时,无论用户是谁,所有查询都会被重写。在某些情况下,这可能会有问题,例如在管理系统时,或者在应用来自复制源或由mysqldump或其他MySQL程序创建的转储文件的语句时。MySQL 8.0.31通过实现新的用户权限SKIP_QUERY_REWRITE为此类问题提供了解决方案;具有此权限的用户发出的语句将被 忽略,并且不会重写。RewriterRewriter
MySQL 8.0.31还添加了一个新的服务器系统变量rewriter_enabled_for_threads_without_privilege_checks。设置为 时,插件不会重写由为其发出的线程(例如复制应用程序线程)发出的可重写语句。默认值为 ,这意味着这些语句将被重写。OFFPRIVILEGE_CHECKS_USERNULLRewriterON
有关更多信息,请参见第 5.6.4 节 “重写器查询重写插件”。
XA 语句的复制筛选。 以前,每当使用 --复制-do-db 或 --复制-忽略-db 时,语句 XA START、 、 和 都会被默认数据库过滤,这可能会导致丢失事务。从MySQL 8.0.31开始,无论binlog_format的值如何,在这种情况下都不会过滤这些语句。XA ENDXA COMMITXA ROLLBACK
复制筛选和权限检查。 从MySQL 8.0.31开始,当使用复制过滤时,副本不再引发与特权检查相关的复制错误,也不会对过滤掉的事件require_row_format验证,从而可以过滤掉任何未通过验证的事务。
由于对筛选的行进行特权检查不再会导致复制停止,因此副本现在只能接受给定用户有权访问的数据库部分。只要仅以基于行的格式复制对数据库此部分的更新,就是如此。
从本地或云服务迁移到 MySQL 数据库服务时,此功能也可能很有用,该服务使用表进行管理或入站复制用户无权访问的其他目的。
有关详细信息,请参见第 17.2.5 节 “服务器如何评估复制筛选规则”,以及第 17.5.1.29 节 “复制过程中的副本错误”。
以下功能在MySQL 8.0中已弃用,并可能在以后的系列中删除。在显示替代项的位置,应更新应用程序以使用它们。
对于使用在MySQL 8.0中已弃用的功能的应用程序,这些功能已在更高的MySQL系列中删除,语句在从MySQL 8.0源复制到更高系列的副本时可能会失败,或者可能对源和副本产生不同的影响。为避免此类问题,应修订使用 8.0 中已弃用的功能的应用程序以避免这些问题,并在可能的情况下使用替代方法。
字符集已弃用。请改用。utf8mb3utf8mb4
以下字符集已弃用:
ucs2(请参见第 10.9.4 节 “ucs2 字符集(UCS-2 统一码编码)”)
macroman和(请参见第 10.10.2 节 “西欧字符集”和第 10.10.3 节 “中欧字符集”macce)
dec(请参见第 10.10.2 节 “西欧字符集”)
hp8(请参见第 10.10.2 节 “西欧字符集”)
在MySQL 8.0.28及更高版本中,以下列任一方式使用时,这些字符集或其排序规则中的任何一个都会产生弃用警告:
应改用前面列出的任何字符集。utf8mb4
因为是MySQL 8.0中的默认身份验证插件,并且提供了身份验证插件功能的超集,因此被弃用;期望在MySQL的未来版本中将其删除。应将使用 进行身份验证的MySQL帐户迁移为使用。caching_sha2_passwordsha256_passwordsha256_passwordsha256_passwordcaching_sha2_password
该插件已重新实现以使用组件基础结构。的插件形式仍然可用,但现在已经弃用;期望在MySQL的未来版本中将其删除。使用该插件的MySQL安装应转换为使用该组件。请参见第 6.4.3.3 节 “转换到密码验证组件”。validate_passwordvalidate_password
不推荐使用“更改表空间”和“删除表空间”语句的子句。ENGINE
PAD_CHAR_TO_FULL_LENGTH SQL 模式已弃用。
AUTO_INCREMENT对于 FLOAT 和 DOUBLE 类型(以及任何同义词)的列,不推荐使用支持。请考虑从此类列中删除该属性,或将其转换为整数类型。AUTO_INCREMENT
对于 FLOAT、双精度型和十进制(以及任何同义词)类型的列,不推荐使用该属性。请考虑对此类列使用简单约束。UNSIGNEDCHECK
FLOAT(和语法来指定 FLOAT 和 DOUBLE 类型列(以及任何同义词)的位数,这是一个非标准的 MySQL 扩展。此语法已弃用。M,D)DOUBLE(M,D)
对于数值数据类型,该属性已弃用,整数数据类型的显示宽度属性也是如此。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用 LPAD() 函数将数字零填充到所需的宽度,也可以将格式化的数字存储在 CHAR 列中。ZEROFILL
对于字符串数据类型,该属性是非标准MySQL扩展,是指定列字符集(如果未指定列字符集,则指定表默认字符集)的二进制()排序规则的简写。在MySQL 8.0中,这种非标准用法是模棱两可的,因为字符集有多个排序规则,因此该属性被弃用;期望在MySQL的未来版本中删除对它的支持。应将应用程序调整为改用显式排序规则。BINARY_binBINARYutf8mb4_binBINARY_bin
使用 指定数据类型或字符集保持不变。BINARY
以前版本的 MySQL 分别支持 非标准速记表达式和 和 。 并被弃用(MySQL 8.0.28及更高版本),现在会产生警告。在这两种情况下,请改用。ASCIIUNICODECHARACTER SET latin1CHARACTER SET ucs2ASCIIUNICODECHARACTER SET
非标准 C 样式 &&、|| 和 ! 运算符分别是标准 SQL AND、OR 和 NOT 运算符的同义词,这些运算符已弃用。应将使用非标准运算符的应用程序调整为使用标准运算符。
除非启用了PIPES_AS_CONCAT SQL 模式,否则不推荐使用||。在这种情况下,表示 SQL 标准字符串串联运算符)。||
JSON_MERGE() 函数已弃用。请改用JSON_MERGE_PRESERVE()。
查询修饰符和随附的 FOUND_ROWS() 函数已弃用。有关替代策略的信息,请参阅FOUND_ROWS()说明。SQL_CALC_FOUND_ROWS
对创建临时表的 和 子句的支持已从 MySQL 8.0.13 开始弃用。TABLESPACE = innodb_file_per_tableTABLESPACE = innodb_temporary
对于 SELECT 语句,从 MySQL 8.0.20 开始,在 SELECT 之后但不在 SELECT 末尾使用子句是不推荐使用的。最好将 放在语句的末尾。INTOFROMINTO
对于 UNION 语句,包含的这两个变体在 MySQL 8.0.20 中已弃用:INTO
在查询表达式的尾随查询块中,使用 before 。INTOFROM
在查询表达式的括号内尾随块中,使用 ,而不考虑其相对于 的位置。INTOFROM
请参见第 13.2.10.1 节 “选择...INTO 声明“,以及第 13.2.10.3 节”联合条款“。
刷新主机已从MySQL 8.0.23开始弃用。相反,请截断性能架构host_cache表:
TRUNCATE TABLE performance_schema.host_cache;
mysql_upgrade客户端已弃用,因为它用于升级系统架构中的系统表和其他架构中的对象的功能已移至MySQL服务器。请参见第 2.11.3 节 “MySQL 升级过程升级的内容”。mysql
--无 dd-升级服务器选项已弃用。它被 --upgrade 选项所取代,该选项提供对数据字典和服务器升级行为的更精细控制。
该文件是创建数据目录并用于存储MySQL版本号的,已被弃用;期望在MySQL的未来版本中将其删除。mysql_upgrade_info
系统变量和选项已弃用。以前,当设置了 relay_log_info_repository=FILE 和 master_info_repository=FILE 时,它们用于指定中继日志信息日志和源信息日志的名称,但这些设置已被弃用。中继日志信息日志和源信息日志的文件的使用已被崩溃安全副本表所取代,这是MySQL 8.0中的默认设置。relay_log_info_file--master-info-file
max_length_for_sort_data系统变量现在已被弃用,因为优化程序更改使其过时且无效。
这些用于压缩与服务器的连接的旧参数已弃用:--compress 客户端命令行选项;mysql_options() C API 函数的选项;slave_compressed_protocol系统变量。有关要使用的参数的信息,请参见第 4.2.8 节 “连接压缩控制”。MYSQL_OPT_COMPRESS
不推荐使用环境变量来指定 MySQL 密码。MYSQL_PWD
使用值() 访问插入中的新行值...重复密钥更新已从MySQL 8.0.20开始弃用。请改用新行和新列的别名。
因为在调用JSON_TABLE()之前指定与SQL标准相反,所以这个语法现在在MySQL中被弃用了。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印警告。在单个调用中指定这两个子句时,请确保首先使用。ON ERRORON EMPTYJSON_TABLE()ON EMPTY
从未支持将具有索引前缀的列作为表的分区键的一部分;以前,在创建、更改或升级分区表时允许这样做,但被表的分区功能排除,并且服务器不会发出发生这种情况的警告。这种宽容的行为现在已被弃用,并且在MySQL的未来版本中可能会被删除,其中在分区键中使用任何此类列会导致创建表或 ALTER TABLE 语句被拒绝。
从MySQL 8.0.21开始,每当使用索引前缀的列被指定为分区键的一部分时,都会为每个这样的列生成警告。每当由于建议的分区键中的所有列都具有索引前缀而拒绝 CREATE TABLE 或 ALTER TABLE 语句时,现在生成的错误将提供拒绝的确切原因。在任一情况下,这都包括分区函数中使用的列通过采用空子句隐式定义为表主键中的列的情况。PARTITION BY KEY()
有关详细信息和示例,请参阅键分区不支持列索引前缀。
InnoDB内存缓存插件已从MySQL 8.0.22开始弃用;期望在MySQL的未来版本中删除对它的支持。
temptable_use_mmap变量已从MySQL 8.0.26开始弃用;期望在MySQL的未来版本中删除对它的支持。
二进制运算符在MySQL 8.0.27中已弃用,您应该期望在MySQL的未来版本中将其删除。使用 now 会导致警告。使用演员表(...作为二进制文件),而不是。BINARY
default_authentication_plugin变量已从MySQL 8.0.27开始弃用;期望在MySQL的未来版本中删除对它的支持。
default_authentication_plugin变量仍在MySQL 8.0.27中使用,但与新的系统变量结合使用,并且优先级低于MySQL 8.0.27中引入的具有多因素身份验证功能的新系统变量。有关详细信息,请参阅默认身份验证插件。authentication_policy
MySQL测试套件使用且通常在生产中使用的--中止从属事件计数和--断开从属事件计数服务器选项已从MySQL 8.0.29起弃用;期望在MySQL的未来版本中删除这两个选项。
myisam_repair_threads系统变量和并行恢复选项在MySQL 8.0.29起被弃用;预计在MySQL的未来版本中将删除对两者的支持。
在MySQL 8.0.29中,myisam_repair_threads 1(默认值)以外的值产生警告。
以前,MySQL接受日期,时间,DATETIME和时间戳文本,其中包含任意数量的(任意)分隔符字符,以及在日期和时间部分之前,之后和之间具有任意数量的空格字符的文本。从MySQL 8.0.29开始,每当文本值包含以下任何内容时,服务器都会引发弃用警告:DATETIMETIMESTAMP
一个或多个非标准分隔符字符
多余的分隔符字符
空格字符 (“ ',0x20)
多余的空格字符
每个时间值发出一个弃用警告,即使它存在多个问题。在严格模式下,此警告不会提升为错误,因此,当严格模式生效时,执行此类值的 INSERT 仍会成功。
您应该期望在MySQL的未来版本中删除非标准行为,并立即采取措施确保您的应用程序不依赖于它。
有关详细信息和示例,请参阅日期和时间上下文中的字符串和数字文本。
replica_parallel_type系统变量及其关联的服务器选项已从MySQL 8.0.29开始弃用。从此版本开始,读取或设置此值会引发弃用警告。期望在MySQL的未来版本中将其删除。--replica-parallel-type
--跳过主机缓存服务器选项已从MySQL 8.0.30开始弃用;预计在将来的MySQL版本中将其删除。请改用host_cache_size系统变量。
从MySQL 8.0.30开始,将replica_parallel_workers系统变量(或等效的服务器选项)设置为0将被弃用,并引发警告。如果希望副本使用单线程,请改用,这将产生相同的结果,但不发出警告。replica_parallel_workers=1
--旧式用户限制选项,旨在向后兼容非常旧的(5.0.3之前)版本,从MySQL 8.0.30开始弃用;现在使用它会引起警告。您应该期望在MySQL的未来版本中删除此选项。
在MySQL 8.0.30之前,ST_TRANSFORM()函数不支持笛卡尔空间参考系统。在 MySQL 8.0.30 及更高版本中,此函数支持用于 WGS 84 伪墨卡托 (SRID 3857) 的常用可视化伪墨卡托 (EPSG 1024) 投影方法。其他笛卡尔 SRS 仍然不受支持。
MySQL 8.0.31为Linux系统添加了只读build_id系统变量,其中在编译时生成160位签名;的值是转换为十六进制字符串的生成值的值,为生成提供唯一标识符。SHA1build_id
build_id每次MySQL启动时都会写入服务器日志。
如果从源代码构建MySQL,则可以观察到每次重新编译服务器时此值都会更改。有关更多信息,请参见第 2.9 节 “从源代码安装 MySQL”。
此变量在 Linux 以外的平台上不受支持。
innodb_log_files_in_group和innodb_log_file_size变量已从MySQL 8.0.30开始弃用。这些变量被innodb_redo_log_capacity变量所取代。有关详细信息,请参见第 15.6.5 节 “重做日志”。
从MySQL 8.0.31开始,由于“FULL”是SQL标准中的保留关键字,因此不推荐使用“FULL”作为未加引号的标识符。这意味着像现在这样的语句会引发警告 ()。为防止发生这种情况,请更改名称,或者(如此处所示)将其封装在反引号中 ():CREATE TABLE full (c1 INT, c2 INT)ER_WARN_DEPRECATED_TO_BE_REMOVED_IDENT_FULL`
CREATE TABLE `full` (c1 INT, c2 INT);
有关更多信息,请参见第 9.3 节 “关键字和保留字”。
以下项目已过时,已在MySQL 8.0中删除。在显示替代项的位置,应更新应用程序以使用它们。
对于使用MySQL 8.0中删除的功能的MySQL 5.7应用程序,从MySQL 5.7源复制到MySQL 8.0副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免此类问题,应修改使用MySQL 8.0中删除的功能的应用程序以避免这些问题,并在可能的情况下使用替代方案。
系统变量已删除。“已读已提交”隔离级别提供类似的功能。innodb_locks_unsafe_for_binlog
MySQL 8.0.0中引入的变量已被删除,并由MySQL 8.0.3中的information_schema_stats_expiry替换。information_schema_stats
information_schema_stats_expiry定义缓存INFORMATION_SCHEMA表统计信息的过期设置。有关更多信息,请参见第 8.2.3 节 “优化INFORMATION_SCHEMA查询”。
与过时的系统表相关的代码在MySQL 8.0.3中被删除。基于系统表的INFORMATION_SCHEMA视图被数据字典表上的内部系统视图所取代。受影响的INFORMATION_SCHEMA视图已重命名:InnoDBInnoDBInnoDB
表 1.1 重命名的 InnoDB 信息架构视图
| 旧名称 | 新名称 |
|---|---|
INNODB_SYS_COLUMNS | INNODB_COLUMNS |
INNODB_SYS_DATAFILES | INNODB_DATAFILES |
INNODB_SYS_FIELDS | INNODB_FIELDS |
INNODB_SYS_FOREIGN | INNODB_FOREIGN |
INNODB_SYS_FOREIGN_COLS | INNODB_FOREIGN_COLS |
INNODB_SYS_INDEXES | INNODB_INDEXES |
INNODB_SYS_TABLES | INNODB_TABLES |
INNODB_SYS_TABLESPACES | INNODB_TABLESPACES |
INNODB_SYS_TABLESTATS | INNODB_TABLESTATS |
INNODB_SYS_VIRTUAL | INNODB_VIRTUAL |
升级到MySQL 8.0.3或更高版本后,请更新引用以前INFORMATION_SCHEMA视图名称的任何脚本。InnoDB
删除了以下与帐户管理相关的功能:
使用格兰特创建用户。请改用“创建用户”。遵循这种做法会使 SQL 模式对 GRANT 语句无关紧要,因此它也被删除,并且当选项文件中的选项的此值的存在阻止 mysqld 启动时,现在会将错误写入服务器日志。NO_AUTO_CREATE_USERsql_mode
使用 GRANT 修改权限分配以外的帐户属性。这包括身份验证、SSL 和资源限制属性。相反,请在创建帐户时使用“创建用户”建立此类属性,或者使用“更改用户”对其进行修改。
IDENTIFIED BY PASSWORD '“创建用户”和“授予”的语法。相反,请使用“创建用户”和“更改用户”,其中值的格式与命名插件兼容。auth_string'IDENTIFIED WITH auth_plugin AS 'auth_string''auth_string'
此外,由于语法已被删除,因此系统变量是多余的,已被删除。IDENTIFIED BY PASSWORDlog_builtin_as_identified_by_password
函数。此外,删除意味着“设置密码...=密码(auth_string”)语法不再可用。PASSWORD()PASSWORD()
系统变量。old_passwords
已删除查询缓存。删除包括以下项目:
和 语句。FLUSH QUERY CACHERESET QUERY CACHE
这些系统变量:、、、、、 。query_cache_limitquery_cache_min_res_unitquery_cache_sizequery_cache_typequery_cache_wlock_invalidate
这些状态变量:、 、 、 、 、 、 、 、 。Qcache_free_blocksQcache_free_memoryQcache_hitsQcache_insertsQcache_lowmem_prunesQcache_not_cachedQcache_queries_in_cacheQcache_total_blocks
这些线程状态:、、、、、、 。checking privileges on cached querychecking query cache for queryinvalidating query cache entriessending cached result to clientstoring result in query cacheWaiting for query cache lock
“选择”修饰符。SQL_CACHE
这些已弃用的查询缓存项仍不推荐使用,但不起作用。预计它们将在将来的MySQL版本中被删除:
“选择”修饰符。SQL_NO_CACHE
系统变量。ndb_cache_check_time
系统变量保持不推荐使用状态,并且始终具有 ;预计它将在将来的MySQL版本中被删除。have_query_cacheNO
数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称来查找数据库。因此,选项和系统变量是无关紧要的,并被删除。--ignore-db-dirignore_db_dirs
DDL 日志(也称为元数据日志)已被删除。从MySQL 8.0.3开始,此功能由数据字典表处理。请参阅查看 DDL 日志。innodb_ddl_log
和 系统变量已被删除。使用 和 代替。tx_isolationtx_read_onlytransaction_isolationtransaction_read_only
系统变量已被删除,因为文件已过时。sync_frm.frm
系统变量和客户端选项已删除。删除了mysql_options() C API 函数的选项。secure_auth--secure-authMYSQL_SECURE_AUTH
系统变量被删除。multi_range_count
系统变量和服务器选项已删除。请改用log_error_verbosity系统变量。log_warnings--log-warnings
已删除sql_log_bin系统变量的全局作用域。 仅具有会话范围,应调整依赖于访问的应用程序。sql_log_bin@@GLOBAL.sql_log_bin
和 系统变量将被删除。metadata_locks_cache_sizemetadata_locks_hash_instances
未使用的 、 、 和 系统变量将被删除。date_formatdatetime_formattime_formatmax_tmp_tables
将删除这些已弃用的兼容性 SQL 模式:、、、、、、、、、、、 、 、 。它们不能再分配给系统变量或用作 mysqldump --兼容选项的允许值。DB2MAXDBMSSQLMYSQL323MYSQL40ORACLEPOSTGRESQLNO_FIELD_OPTIONSNO_KEY_OPTIONSNO_TABLE_OPTIONSsql_mode
将删除子句的已弃用或限定符。以前依赖于排序的查询可能会产生与以前的MySQL版本不同的结果。要生成给定的排序顺序,请提供一个子句。ASCDESCGROUP BYGROUP BYORDER BY
已删除解释语句的 和 关键字。这些关键字是不必要的,因为它们的效果始终是启用的。EXTENDEDPARTITIONS
这些与加密相关的项目将被删除:
和 函数。ENCODE()DECODE()
函数。ENCRYPT()
和 函数、选项、系统变量、FLUSH 语句的选项和 CMake 选项。DES_ENCRYPT()DES_DECRYPT()--des-key-filehave_cryptDES_KEY_FILEHAVE_CRYPT
代替已删除的加密函数:对于 ,请考虑使用 SHA2() 代替单向哈希。对于其他人,请考虑改用 AES_ENCRYPT() 和 AES_DECRYPT()。ENCRYPT()
在MySQL 5.7中,不推荐使用多个名称下可用的几个空间函数,以使空间函数命名空间更加一致,目标是每个空间函数名称如果执行精确的操作,或者如果它执行基于最小边界矩形的操作,则以开头。在MySQL 8.0中,已弃用的函数被删除,只留下相应的 和 函数:ST_MBRST_MBR
这些函数被删除,取而代之的是名称:、 、 、 、 、 。MBRContains()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()IsSimple()LineFromText()LineFromWKB()LineStringFromText()LineStringFromWKB()MLineFromText()MLineFromWKB()MPointFromText()MPointFromWKB()MPolyFromText()MPolyFromWKB()MultiLineStringFromText()MultiLineStringFromWKB()MultiPointFromText()MultiPointFromWKB()MultiPolygonFromText()MultiPolygonFromWKB()NumGeometries()NumInteriorRings()NumPoints()PointFromText()PointFromWKB()PointN()PolyFromText()PolyFromWKB()PolygonFromText()PolygonFromWKB()SRID()StartPoint()Touches()X()Y()
GLength()被删除以支持ST_Length()。
第 12.17.4 节 “从 WKB 值创建几何值的函数”中描述的函数以前接受 WKB 字符串或几何参数。不再允许使用几何参数,否则将产生错误。有关将查询从使用几何参数迁移出去的准则,请参阅该部分。
解析器不再将 在 SQL 语句中视为 的同义词。请改用。\NNULLNULL
此更改不会影响使用“加载数据”或“选择...INTO 输出文件,对于 其继续由 表示。请参见第 13.2.7 节 “加载数据语句”。NULL\N
PROCEDURE ANALYSE()语法被删除。
客户端和选项已被删除。使用 --ssl 模式 = 必需,而不是 或 。使用 --ssl 模式 = 已禁用,而不是 、 或 。使用 --ssl 模式 =VERIFY_IDENTITY而不是选项。(服务器端 --ssl 选项仍然可用,但自 MySQL 8.0.26 起已弃用,并可能在将来的 MySQL 版本中删除。--ssl--ssl-verify-server-cert--ssl=1--enable-ssl--ssl=0--skip-ssl--disable-ssl--ssl-verify-server-cert
对于 C API,mysql_options() 的选项对应于客户端和选项,并被删除。与 or 的选项值一起使用。MYSQL_OPT_SSL_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT--ssl--ssl-verify-server-certMYSQL_OPT_SSL_MODESSL_MODE_REQUIREDSSL_MODE_VERIFY_IDENTITY
已删除服务器选项。--temp-pool
系统变量被删除。ignore_builtin_innodb
服务器不再执行包含特殊字符的MySQL 5.1之前数据库名称的转换,并添加前缀。由于不再执行这些转换,因此将删除 mysqlcheck 的 和 选项、ALTER 数据库语句的子句和状态变量。#mysql50#--fix-db-names--fix-table-namesUPGRADE DATA DIRECTORY NAMECom_alter_db_upgrade
仅支持从一个主要版本升级到另一个主要版本(例如,从5.0升级到5.1,或从5.1升级到5.5),因此几乎不需要将较旧的5.0数据库名称转换为MySQL的当前版本。作为一种解决方法,请将 MySQL 5.0 安装升级到 MySQL 5.1,然后再升级到更新的版本。
mysql_install_db程序已从MySQL发行版中删除。数据目录初始化应改为使用 --初始化或 --初始化不安全选项调用 mysqld 来执行。此外,还删除了mysql_install_db使用的 mysqld 选项,并删除了控制mysql_install_db安装位置的选项。--bootstrapINSTALL_SCRIPTDIRCMake
通用分区处理程序已从 MySQL 服务器中删除。为了支持给定表的分区,用于该表的存储引擎现在必须提供自己的(“本机”)分区处理程序。和选项将从MySQL服务器中删除,并且与分区相关的条目不再显示在显示插件的输出或INFORMATION_SCHEMA中。插件表。--partition--skip-partition
目前有两个MySQL存储引擎提供本机分区支持:创新数据库和NDB。其中,仅在 MySQL 8.0 中受支持。任何使用任何其他存储引擎在MySQL 8.0中创建分区表的尝试都会失败。InnoDB
升级的后果。 不支持使用非存储引擎(如 MyISAM)将分区表从 MySQL 5.7(或更早版本)直接升级到 MySQL 8.0。有两个选项可用于处理此类表:InnoDB
删除表的分区,使用 ALTER 表 ...删除分区。
将用于表的存储引擎更改为 ,并更改表...引擎 = 创新数据库。InnoDB
在将服务器升级到MySQL 8.0之前,必须对每个分区的非表执行刚刚列出的两个操作中的至少一个。否则,升级后将无法使用此类表。InnoDB
由于表创建语句会导致使用存储引擎的分区表而没有分区支持,现在失败并显示错误(ER_CHECK_NOT_IMPLEMENTED),因此您必须确保转储文件中的任何语句(例如由mysqldump写入的语句)中的任何语句,这些语句来自您希望导入到创建分区表的MySQL 8.0服务器中,并且不希望同时指定存储引擎例如,没有本机分区处理程序。您可以通过执行以下任一操作来执行此操作:MyISAM
从使用选项值(而不是)的语句中删除对分区的任何引用。CREATE TABLESTORAGE ENGINEInnoDB
将存储引擎指定为 ,或允许默认用作表的存储引擎。InnoDBInnoDB
有关更多信息,请参见第 24.6.2 节 “与存储引擎相关的分区限制”。
系统和状态变量信息不再保留在 中。这些表将被删除:、、、、 。请改用相应的性能架构表。请参见第 27.12.14 节 “性能模式系统变量表”和第 27.12.15 节 “性能模式状态变量表”。此外,还删除了系统变量。它用于将表中的系统和状态变量信息移动到性能架构表的过渡期间,并且不再需要。这些状态变量将被删除:、 、 、 、 。他们提供的信息在性能架构表中可用;请参阅迁移到性能架构系统和状态变量表。INFORMATION_SCHEMAGLOBAL_VARIABLESSESSION_VARIABLESGLOBAL_STATUSSESSION_STATUSshow_compatibility_56INFORMATION_SCHEMASlave_heartbeat_periodSlave_last_heartbeatSlave_received_heartbeatsSlave_retried_transactionsSlave_running
删除了“性能架构”表,删除了“performance_timers”表中的行。setup_timersTICK
嵌入式服务器库以及:libmysqld
mysql_options()、、 和 选项MYSQL_OPT_GUESS_CONNECTIONMYSQL_OPT_USE_EMBEDDED_CONNECTIONMYSQL_OPT_USE_REMOTE_CONNECTIONMYSQL_SET_CLIENT_IP
mysql_config、和选项--libmysqld-libs--embedded-libs--embedded
“ 、 和 选项WITH_EMBEDDED_SERVERWITH_EMBEDDED_SHARED_LIBRARYINSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR
(未记录的)我的 sql 选项--server-arg
最可怕的 、 和 选项--embedded-server--server-arg--server-file
mysqltest_embedded和mysql_client_test_embedded测试程序
已删除mysql_plugin实用程序。替代方法包括在服务器启动时使用 --插件加载或 --插件加载-添加选项加载插件,或在运行时使用 INSTALL PLUGIN 语句加载插件。
解析实用程序已删除。可以改用 ns 查找、主机或挖掘。
resolve_stack_dump实用程序已删除。来自官方MySQL构建的堆栈跟踪始终是符号化的,因此无需使用resolve_stack_dump。
以下服务器错误代码未使用,并且已被删除。应更新专门测试任何这些错误的应用程序。
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
已弃用的表将被删除。请改用性能架构data_locks和data_lock_waits表。INFORMATION_SCHEMAINNODB_LOCKSINNODB_LOCK_WAITS
在MySQL 5.7中,表中的列以及架构innodb_lock_waits和x$innodb_lock_waits视图中的列包含组合的架构/表名称值。在MySQL 8.0中,data_locks表和架构视图包含单独的架构名称和表名称列。请参见第 28.4.3.9 节 “innodb_lock_waits和 x$innodb_lock_waits 视图”。LOCK_TABLEINNODB_LOCKSlocked_tablesyssys
InnoDB不再支持压缩的临时表。启用innodb_strict_mode(默认值)时,如果指定了 或,则“创建临时表”将返回错误。如果禁用innodb_strict_mode,则会发出警告,并使用非压缩行格式创建临时表。ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE
InnoDB在MySQL数据目录之外创建表空间数据文件时,不再创建文件(符号链接文件)。innodb_directories选项现在支持查找在数据目录之外创建的表空间文件。.islInnoDB
通过此更改,不再支持在服务器脱机时通过手动修改文件来移动远程表空间。现在,innodb_directories选项支持移动远程表空间文件。请参见第 15.6.3.6 节 “在服务器脱机时移动表空间文件”。.isl
删除了以下文件格式变量:InnoDB
文件格式变量对于创建与MySQL 5.1中的早期版本兼容的表是必需的。现在MySQL 5.1已经达到了其产品生命周期的终点,不再需要这些选项。InnoDB
该列已从INNODB_TABLES和INNODB_TABLESPACES信息架构表中删除。FILE_FORMAT
删除了在 XA 事务中启用对两阶段提交的支持的系统变量。 始终启用对 XA 事务中两阶段提交的支持。innodb_support_xaInnoDB
已删除对 DTrace 的支持。
该函数已删除。请改用JSON_ARRAY_APPEND()。JSON_APPEND()
MySQL 8.0.13中删除了对在共享表空间中放置表分区的支持。共享表空间包括系统表空间和常规表空间。有关标识共享表空间中的分区并将其移动到每表文件表空间的信息,请参见第 2.11.5 节 “准备升级安装”。InnoDBInnoDB
在MySQL 8.0.13中不推荐在SET以外的语句中设置用户变量的支持。此功能可能会在MySQL 9.0中删除。
删除了perror选项。请改用ndb_perror实用程序。--ndb
该变量已被删除。innodb_rollback_segments变量执行相同的函数,应改用。innodb_undo_logs
已删除状态变量。可以使用以下命令检索每个表空间的可用回滚段数Innodb_available_undo_logsSHOW VARIABLES LIKE 'innodb_rollback_segments';
从MySQL 8.0.14开始,以前弃用的innodb_undo_tablespaces变量不再可配置。有关更多信息,请参见第 15.6.3.4 节 “撤消表空间”。
已删除对该语句的支持。ALTER TABLE ... UPGRADE PARTITIONING
从MySQL 8.0.16开始,对internal_tmp_disk_storage_engine系统变量的支持已被删除;磁盘上的内部临时表现在始终使用 InnoDB 存储引擎。有关详细信息,请参阅磁盘内部临时表的存储引擎。
“DISABLE_SHARED CMake”选项未使用,已被删除。
myisam_repair_threads系统变量,自MySQL 8.0.30起。