# 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_password
和sha256_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
支持现在等待
和跳过锁定
选项选择...分享
和选择 ... 更新
锁定读取语句。现在等待
如果请求的行被另一个事务锁定,则使语句立即返回。跳过锁定
从结果集中删除锁定的行。看使用 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
根据服务器上检测到的内存量自动配置以下选项:-
此选项适用于在专用服务器上运行的 MySQL 服务器实例。有关详细信息,请参阅第 15.8.12 节,“为专用 MySQL 服务器启用自动配置”.
新的
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_wait_for_flush_spin_hwm
:定义最大平均日志刷新时间,超过该时间用户线程在等待刷新重做时不再旋转。innodb_log_spin_cpu_abs_lwm
: 定义用户线程在等待刷新重做时不再旋转的最小 CPU 使用量。innodb_log_spin_cpu_pct_hwm
:定义用户线程在等待刷新重做时不再旋转的最大 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 开始,
算法=即时
支持以下更改表
操作:添加一列。此功能也称为“即时
添加列
”。限制适用。看第 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_TABLESPACES
table 提供有关会话临时表空间的元数据。全局临时表空间 (
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_空闲_刷新_pct
MySQL 8.0.18中引入的变量允许在空闲期间限制页面刷新,这有助于延长固态存储设备的使用寿命。看见在空闲期间限制缓冲区刷新.有效采样
InnoDB
MySQL 8.0.19支持用于生成直方图统计的数据。看见直方图统计分析.从MySQL 8.0.20开始,doublewrite缓冲区存储区域位于doublewrite文件中。在以前的版本中,存储区域位于系统表空间中。将存储区域移出系统表空间可以减少写入延迟,提高吞吐量,并在放置双写缓冲页方面提供灵活性。为高级双写缓冲区配置引入了以下系统变量:
-
定义双写缓冲区文件目录。
-
定义doublewrite文件的数量。
-
定义批量写入的每个线程的最大doublewrite页数。
-
定义批量写入的doublewrite页数。
有关更多信息,请参阅第15.6.4节,“双写缓冲区”.
-
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使用
.从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_mmap
MySQL 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_使用_fdatasync
MySQL 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操作”.
**字符集支持。**默认字符集已从
拉丁语1
到utf8mb4
这个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
表)。基于子查询中包含的任何提示和
优化器_开关
.当半联接优化用于符合条件的单个表时
删去
或使现代化
,这在优化器跟踪中可见:对于多表语句加入优化
对象,而对于单个表语句则没有。转换也可以在的输出中看到解释格式=树
或解释分析
; 单表语句显示<迭代器执行器不可执行>
,而多表语句则报告完整的计划。
**提高了哈希连接性能。**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_limit
和regexp_时间限制
系统变量通过匹配引擎控制资源消耗。有关更多信息,请参阅第12.8.2节“正则表达式”。有关使用正则表达式的应用程序可能受到实现更改影响的方式的信息,请参阅正则表达式兼容性注意事项.**内部临时表。**那个
诱人的
存储引擎取代了记忆力
存储引擎作为内存内部临时表的默认引擎。这个诱人的
存储引擎为用户提供高效的存储瓦尔查尔
和VARBINARY
柱。这个内部存储引擎
会话变量定义内存内部临时表的存储引擎。允许值为诱人的
(默认)和记忆力
这个诱人的_max_ram
变量定义了诱人的
存储引擎可以在数据存储到磁盘之前使用。**登录中。**错误日志被重写为使用MySQL组件体系结构。传统的错误记录是使用内置组件实现的,而使用系统日志的记录是作为可加载组件实现的。此外,还提供了可加载的JSON日志编写器。要控制要启用的日志组件,请使用
日志错误服务
系统变量。有关更多信息,请参阅第5.4.2节“错误日志”.**备用锁。**一种新型的备份锁允许在在线备份期间使用DML,同时防止可能导致快照不一致的操作。新的备份锁受
锁定备份实例
和解锁实例
语法。这个备份管理
使用这些语句需要特权。**复制。**对MySQL复制进行了以下增强:
- MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制记录,在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过设置新的
binlog_行_值_选项
系统变量为部分_JSON
。有关更多信息,请参阅JSON值的部分更新,以及binlog_行_值_选项
.
- MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制记录,在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过设置新的
**连接管理。**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开始,
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_join
MySQL 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);
使用别名
新
对于新行,以及在某些情况下,别名m
和n
对于此行的列插入
语句可以用许多不同的方式重写,下面给出了一些例子: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节,“索引提示”.这里列出了新的提示,以及它们的
力指数
或忽略索引
等价物:群体指数
:相当于按组别划分的部队指数
无组索引
:相当于忽略分组依据的索引
加入索引
:相当于连接的强制索引
没有加入索引
:相当于忽略连接的索引
订单指数
:相当于按订单排序的强制索引
无订单索引
:相当于忽略ORDER BY的索引
指数
:与相同群体指数
加加入索引
加订单指数
; 相当于力指数
没有修饰语无索引
:与相同无组索引
加没有加入索引
加无订单索引
; 相当于忽略索引
没有修饰语例如,以下两个查询是等效的:
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标准,不再接受使用窗口函数的以下构造:
引导(*
expr*, *
nn*)
和落后(*
表达式*, *
nn*)
, 在哪里*nn
*是负数这有助于更好地遵守 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 授权表上作为非锁定读取执行的操作包括:
**对 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
相反以下字符集已弃用:
马克罗曼
和麦切
(见第10.10.2节,“西欧字符集”和第10.10.3节,“中欧字符集”)12月
(见第10.10.2节,“西欧字符集”)hp8
(见第10.10.2节,“西欧字符集”)在MySQL 8.0.28及更高版本中,当以以下任一方式使用这些字符集或其排序规则时,都会生成一个弃用警告:
在任何SQL语句中指定时,包括但不限于
创建表格
,创建数据库
,定名
和改变桌子
你应该使用
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的同义词的运算符和
,或
和不
分别不推荐使用运算符。使用非标准运算符的应用程序应调整为使用标准运算符。笔记
这个
JSON_MERGE()
函数已弃用。使用JSON_MERGE_PRESERVE()
相反支持
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升级过程升级了什么”.这个
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节,“优化信息_“模式查询”.与废弃设备相关的代码
InnoDB
MySQL 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_ENFORCE
和MYSQL_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_LOCKS
和INNODB_LOCK_WAITS
表被删除。使用性能模式数据锁
和data_lock_waits
代替表。笔记
在 MySQL 5.7 中,
LOCK_TABLE
列中的INNODB_LOCKS
表和锁定表
列中的系统
图式innodb_lock_waits
和x$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_TABLES
和INNODB_TABLESPACES
信息模式表。
这
innodb_support_xa
删除了系统变量,该变量支持 XA 事务中的两阶段提交。InnoDB
始终启用对 XA 事务中的两阶段提交的支持。已删除对 DTrace 的支持。
这
JSON_APPEND()
功能被删除。采用JSON_ARRAY_APPEND()
反而。支持将表分区放在共享中
InnoDB
MySQL 8.0.13 中删除了表空间。共享表空间包括InnoDB
系统表空间和通用表空间。有关识别共享表空间中的分区并将它们移动到 file-per-table 表空间的信息,请参阅第 2.11.5 节,“准备升级安装”.支持在语句以外的语句中设置用户变量
放
在 MySQL 8.0.13 中已弃用。此功能可能会在 MySQL 9.0 中删除。这
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_threads
MySQL 8.0.30 的系统变量。