本节总结了MySQL 8.0中添加、弃用和删除的内容。配套部分列出了MySQL服务器选项和变量,这些选项和变量在MySQL 8.0中被添加、弃用或删除;看到<一个class="xref" href="//www.delbede.com/doc/refman/en/added-deprecated-removed.html" title="第1.4节,“MySQL 8.0中添加,弃用或删除的服务器和状态变量和选项”">第1.4节,“MySQL 8.0中添加,弃用或删除的服务器和状态变量和选项”一个>.
MySQL 8.0增加了以下特性:
数据字典。米ySQL现在合并了一个事务数据字典,用于存储有关数据库对象的信息。在以前的MySQL版本中,字典数据存储在元数据文件和非事务性表中。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/data-dictionary.html" title="第14章,">第14章,MySQL数据字典.
原子数据定义语句(Atomic DDL)。原子DDL语句将与DDL操作相关的数据字典更新、存储引擎操作和二进制日志写入合并到单个原子事务中。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/atomic-ddl.html" title="第13.1.1节“原子数据定义语句支持”">第13.1.1节“原子数据定义语句支持”一个>.
升级过程。以前,在安装了新版本的MySQL之后,MySQL服务器会在下次启动时自动升级数据字典表,之后DBA就可以调用了<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-upgrade.html" title="">mysql_upgrade中的系统表进行手动升级mysql
模式,以及其他模式中的对象,如sys
模式和用户模式。
从MySQL 8.0.16开始,服务器执行以前由<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-upgrade.html" title="">mysql_upgrade.在安装了新的MySQL版本之后,服务器现在在下次启动时自动执行所有必要的升级任务,而不依赖于DBA调用<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-upgrade.html" title="">mysql_upgrade.此外,服务器更新帮助表的内容<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-upgrade.html" title="">mysql_upgrade没有)。一个新的<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——升级
服务器选项提供对服务器如何执行自动数据字典和服务器升级操作的控制。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/upgrading-what-is-upgraded.html" title="第2.11.3节“MySQL升级过程升级了什么”">第2.11.3节“MySQL升级过程升级了什么”一个>.
安全和帐户管理。添加这些增强功能是为了提高安全性,并使DBA在帐户管理方面具有更大的灵活性:
中的授权表mysql
系统数据库InnoDB
(事务)表。在此之前,这些是MyISAM
(nontransactional)表。授权表存储引擎的更改是对帐户管理报表行为的相应更改的基础。以前,帐户管理报表(例如<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">创建用户
或<一个class="link" href="//www.delbede.com/doc/refman/en/drop-user.html" title="">减少用户
)命名多个用户可能对某些用户成功而对其他用户失败。现在,每个语句都是事务性的,要么对所有指定用户都成功,要么回滚,如果发生任何错误则不起作用。如果执行成功,则将语句写入二进制日志,如果执行失败则不写入;在这种情况下,发生回滚并且不做任何更改。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/atomic-ddl.html" title="第13.1.1节“原子数据定义语句支持”">第13.1.1节“原子数据定义语句支持”一个>.
一个新的caching_sha2_password
身份验证插件可用。就像sha256_password
插件,caching_sha2_password
实现SHA-256密码散列,但使用缓存来解决连接时的延迟问题。它还支持更多的传输协议,并且不需要为基于RSA密钥对的密码交换功能链接OpenSSL。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/caching-sha2-pluggable-authentication.html" title="第6.4.1.2节,“缓存SHA-2可插拔认证”">第6.4.1.2节,“缓存SHA-2可插拔认证”一个>.
的caching_sha2_password
和sha256_password
身份验证插件提供比mysql_native_password
插件,caching_sha2_password
提供比sha256_password
.由于这些优越的安全性和性能特点caching_sha2_password
,它现在是首选的身份验证插件,也是默认的身份验证插件,而不是mysql_native_password
.有关更改默认插件对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/upgrading-from-previous-series.html" title="caching_sha2_password作为首选鉴权插件">caching_sha2_password作为首选鉴权插件一个>.
MySQL现在支持角色,它被命名为特权集合。角色可以创建和删除。角色可以拥有授予和撤销的权限。可以对用户帐户授予和撤销角色。帐户的活动适用角色可以从授予该帐户的角色中选择,并且可以在该帐户的会话期间更改。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/roles.html" title="第6.2.10节“使用角色”">第6.2.10节“使用角色”一个>.
MySQL现在纳入了用户帐户类别的概念,系统用户和普通用户根据他们是否拥有<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">SYSTEM_USER
特权。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/account-categories.html" title="第6.2.11节“帐户类别”">第6.2.11节“帐户类别”一个>.
以前,除了某些模式之外,不可能授予全局应用的特权。这是可能的,如果<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">partial_revokes
启用系统变量。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/partial-revokes.html" title="第6.2.12节,“使用部分撤销的权限限制”">第6.2.12节,“使用部分撤销的权限限制”一个>.
的<一个class="link" href="//www.delbede.com/doc/refman/en/grant.html" title="">格兰特
语句有作为
子句,该子句指定要用于语句执行的特权上下文的附加信息。这种语法在SQL级别上是可见的,尽管它的主要目的是通过使这些限制出现在二进制日志中,从而在所有节点上实现由部分调用施加的授予者特权限制的统一复制。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/grant.html" title="第13.7.1.6节“授予书声明书”">第13.7.1.6节“授予书声明书”一个>.用户
(作用)
MySQL现在维护有关密码历史的信息,启用对重用以前的密码的限制。dba可以要求在一定次数的密码更改或一段时间内不从以前的密码中选择新密码。可以在全局和每个帐户的基础上建立密码重用策略。
现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使dba能够在不证明用户知道当前密码的情况下阻止用户更改密码。可以在全局和每个帐户的基础上建立密码验证策略。
帐户现在允许使用双重密码,这使得可以在复杂的多服务器系统中无缝地执行分阶段的密码更改,而不会停机。
MySQL现在允许管理员配置用户帐户,以便由于密码不正确而导致多次连续登录失败导致临时帐户锁定。每个帐户所需的失败次数和锁定时间是可配置的。
这些新功能为dba提供了对密码管理更全面的控制。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/password-management.html" title="6.2.15“密码管理”">6.2.15“密码管理”一个>.
MySQL现在支持FIPS模式,如果使用OpenSSL编译,并且在运行时可以使用OpenSSL库和FIPS对象模块。FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对更长的密钥长度的要求。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/fips-mode.html" title="第6.8节,“FIPS支持”">第6.8节,“FIPS支持”一个>.
服务器用于新连接的TLS上下文现在可以在运行时重新配置。这个功能可能是有用的,例如,避免重新启动已经运行了很长时间的MySQL服务器,因为它的SSL证书已经过期。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/using-encrypted-connections.html" title="加密连接的服务器端运行时配置和监控">加密连接的服务器端运行时配置和监控一个>.
如果服务器和客户端都使用OpenSSL 1.1.1或更高版本编译,则OpenSSL 1.1.1支持TLS v1.3协议进行加密连接,MySQL 8.0.16及更高版本也支持TLS v1.3协议。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/encrypted-connection-protocols-ciphers.html" title="第6.3.2节“加密连接TLS协议和密码”">第6.3.2节“加密连接TLS协议和密码”一个>.
MySQL现在将在命名管道上授予客户端的访问控制设置为在Windows上成功通信所需的最小值。较新的MySQL客户端软件可以打开命名管道连接,而无需任何额外配置。如果旧的客户端软件不能立即升级,新的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">named_pipe_full_access_group
system变量可用于为Windows组提供打开命名管道连接所需的权限。完全访问组中的成员应该是受限的和临时的。
资源管理。米ySQL现在支持创建和管理资源组,并允许将服务器内运行的线程分配给特定的组,以便线程根据组可用的资源执行。组属性启用对其资源的控制,以启用或限制组中线程的资源消耗。dba可以根据不同的工作负载适当地修改这些属性。目前,CPU时间是一种可管理的资源,用概念来表示”虚拟CPU”这个术语包括CPU内核、超线程、硬件线程等等。服务器在启动时决定有多少虚拟cpu可用,具有适当权限的数据库管理员可以将这些cpu与资源组关联,并为组分配线程。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/resource-groups.html" title="第5.1.16节“资源组”">第5.1.16节“资源组”一个>.
表加密管理。现在可以通过定义和强制默认加密来全局管理表加密。的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">default_table_encryption
变量为新创建的模式和通用表空间定义加密默认值。方法定义模式的默认加密默认加密
子句创建模式时。默认情况下,表继承创建它的模式或通用表空间的加密。属性来强制加密默认值<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">table_encryption_privilege_check
变量。特权检查发生在创建或修改模式或通用表空间的加密设置与<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">default_table_encryption
设置,或者在使用不同于默认模式加密的加密设置创建或修改表时。的<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">TABLE_ENCRYPTION_ADMIN
权限允许在以下情况下重写默认加密设置<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">table_encryption_privilege_check
启用。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-data-encryption.html" title="定义模式和通用表空间的默认加密">定义模式和通用表空间的默认加密一个>.
InnoDB增强。这些InnoDB
增强功能包括:
当前的最大自动增量计数器值在每次值更改时被写入重做日志,并保存到每个检查点上的引擎私有系统表中。这些更改使当前的最大自动增量计数器值在服务器重新启动时保持不变。另外:
重新启动服务器不再取消Auto_increment = n
表选择。如果将自动增量计数器初始化为特定值,或者将自动增量计数器值更改为更大的值,则新值将在服务器重新启动时持久化。
事件发生后立即重启服务器<一个class="link" href="//www.delbede.com/doc/refman/en/commit.html" title="">回滚
操作不再导致重用分配给回滚事务的自动增量值。
如果你修改了AUTO_INCREMENT
列值设置为大于当前最大自动增量值的值<一个class="link" href="//www.delbede.com/doc/refman/en/update.html" title="">更新
操作(例如),新值被持久化,然后继续<一个class="link" href="//www.delbede.com/doc/refman/en/insert.html" title="">插入
操作从新的更大的值开始分配自动递增值。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-auto-increment-handling.html" title="第15.6.1.6节,“InnoDB中的AUTO_INCREMENT处理”">第15.6.1.6节,“InnoDB中的AUTO_INCREMENT处理”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-auto-increment-handling.html" title="InnoDB AUTO_INCREMENT计数器初始化">InnoDB AUTO_INCREMENT计数器初始化一个>.
当遇到索引树损坏时,InnoDB
将损坏标志写入重做日志,从而使损坏标志崩溃安全。InnoDB
还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间,InnoDB
从两个位置读取损坏标志并合并结果,然后将内存中的表和索引对象标记为损坏。
的InnoDB
memcached插件支持多个得到
操作(在单个操作中获取多个键值对)memcached查询)和范围查询。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-memcached-multiple-get-range-query.html" title="第15.20.4节,“InnoDB memcached的多get和Range查询支持”">第15.20.4节,“InnoDB memcached的多get和Range查询支持”一个>.
一个新的动态变量,<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_deadlock_detect
,可用于禁用死锁检测。在高并发性系统上,当许多线程等待相同的锁时,死锁检测可能会导致速度变慢。有时,禁用死锁检测并依赖于<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_lock_wait_timeout
设置发生死锁时的事务回滚。
新<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-cached-indexes-table.html" title="">INFORMATION_SCHEMA。在没有DB_CACHED_INDEXES
中缓存的索引页的数量InnoDB
每个索引的缓冲池。
InnoDB
临时表现在在共享临时表空间中创建。ibtmp1
.
InnoDB
支持NOWAIT
和跳过锁
选择与选择……为分享
和选择……更新
锁定读语句。NOWAIT
如果请求的行被另一个事务锁定,则导致语句立即返回。跳过锁
从结果集中删除锁定的行。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-locking-reads.html" title="带NOWAIT和SKIP LOCKED的读并发锁定">带NOWAIT和SKIP LOCKED的读并发锁定一个>.
选择……为分享
替换选择……锁定共享模式
,但锁定共享模式
保持向后兼容性。表述是等价的。然而,更新
和为分享
支持NOWAIT
,跳过锁
,的
选项。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/select.html" title="第13.2.10节," SELECT语句"">第13.2.10节," SELECT语句"一个>.tbl_name
的
对命名表应用锁定查询。tbl_name
添加分区
,删除分区
,合并分区
,重组分区
,重建分区
ALTER TABLE
选项由本地分区本地api支持,并且可以与算法={复制|原地}
和锁
条款。
删除分区
与算法=原地
删除分区中存储的数据并删除分区。然而,删除分区
与算法=复制
或<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">old_alter_table =对
重新构建分区表,并尝试将数据从被删除的分区移动到具有兼容的分区…值
定义。删除无法移动到其他分区的数据。
的InnoDB
存储引擎现在使用MySQL数据字典,而不是它自己的存储引擎特定的数据字典。有关数据字典的信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/data-dictionary.html" title="第14章,">第14章,MySQL数据字典.
mysql
系统表和数据字典表现在在一个单独创建InnoDB
表空间文件名为mysql.ibd
在MySQL data目录下。以前,这些表是单独创建的InnoDB
表空间文件mysql
数据库目录。
MySQL 8.0中引入了以下undo表空间更改:
默认情况下,undo日志现在驻留在MySQL实例初始化时创建的两个undo表空间中。Undo日志不再在system表空间中创建。
从MySQL 8.0.14开始,可以在运行时使用以下命令在选定的位置创建额外的undo表空间<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建undo表空间
语法。
创建undo表空间tablespace_name添加数据文件file_name.ibu ';
命令创建的表空间<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建undo表空间
可以在运行时使用<一个class="link" href="//www.delbede.com/doc/refman/en/drop-tablespace.html" title="">删除undo表空间
语法。
删除undo表空间tablespace_name;
撤销表空间
语法可用于将撤销表空间标记为活动或非活动。
撤销表空间tablespace_name{活动|非活动};
一个状态
表空间的状态<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tablespaces-table.html" title="">INFORMATION_SCHEMA。INNODB_TABLESPACES
表格undo表空间必须在空
状态,然后才能删除。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_undo_log_truncate
变量默认是启用的。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_rollback_segments
变量定义每个undo表空间的回滚段数。在此之前,<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_rollback_segments
指定MySQL实例的回滚段总数。这一更改增加了并发事务可用的回滚段的数量。更多的回滚段增加了并发事务为撤销日志使用单独回滚段的可能性,从而减少了资源争用。
对影响缓冲池预刷新和刷新行为的变量的默认值进行了修改:
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_max_dirty_pages_pct_lwm
默认值现在是10。先前的默认值0禁用缓冲池预冲洗。当缓冲池中脏页的百分比超过10%时,值10启用预刷新。启用预冲洗可提高性能一致性。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_max_dirty_pages_pct
默认值从75增加到90。InnoDB
尝试从缓冲池中刷新数据,使脏页的百分比不超过此值。增加的默认值允许缓冲池中更大百分比的脏页。
默认的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_autoinc_lock_mode
设置现在是2(交错)。交错锁模式允许并行执行多行插入,从而提高了并发性和可伸缩性。新<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_autoinc_lock_mode
default setting反映了MySQL 5.7中从基于语句复制到基于行复制的默认复制类型的变化。基于语句的复制需要连续自动增量锁模式(之前的默认模式),以确保为给定的SQL语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制对SQL语句的执行顺序不敏感。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-auto-increment-handling.html" title="InnoDB AUTO_INCREMENT锁模式">InnoDB AUTO_INCREMENT锁模式一个>.
对于使用基于语句的复制的系统,新的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_autoinc_lock_mode
默认设置可能会破坏依赖于顺序自动增量值的应用程序。要恢复以前的默认值,请设置<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_autoinc_lock_mode
为1。
支持重命名通用表空间<一个class="link" href="//www.delbede.com/doc/refman/en/alter-tablespace.html" title="">修改表空间…重命名为
语法。
新<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_dedicated_server
变量,该变量在默认情况下是禁用的InnoDB
根据服务器检测到的内存大小,自动配置以下选项:
该选项适用于在专用服务器上运行的MySQL服务器实例。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-dedicated-server.html" title="第15.8.12节,为专用MySQL服务器启用自动配置">第15.8.12节,为专用MySQL服务器启用自动配置一个>.
新<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tablespaces-brief-table.html" title="">INFORMATION_SCHEMA。INNODB_TABLESPACES_BRIEF
视图提供空间、名称、路径、标志和空间类型数据InnoDB
表空间。
的<一个class="ulink" href="http://www.zlib.net/" target="_top">zlib库一个>与MySQL捆绑的版本从1.2.3版本提升到1.2.11版本。MySQL在zlib库的帮助下实现压缩。
如果你使用InnoDB
压缩表,参见<一个class="xref" href="//www.delbede.com/doc/refman/en/upgrading-from-previous-series.html" title="第2.11.4节,“MySQL 8.0的变化”">第2.11.4节,“MySQL 8.0的变化”一个>获取相关的升级含义。
序列化的字典信息(SDI)存在于所有InnoDB
表空间文件,全局临时表空间文件和undo表空间文件除外。SDI是表和表空间对象的序列化元数据。SDI数据的存在提供了元数据冗余。例如,如果数据字典不可用,可能会从表空间文件中提取字典对象元数据。进行SDI提取<一个class="link" href="//www.delbede.com/doc/refman/en/ibd2sdi.html" title="">ibd2sdi工具。SDI数据存储在JSON
格式。
表空间文件中包含SDI数据会增加表空间文件的大小。一条SDI记录需要一个索引页,默认大小为16KB。但是,SDI数据在存储时被压缩,以减少存储占用。
的InnoDB
存储引擎现在支持原子DDL,这确保DDL操作要么完全提交,要么回滚,即使服务器在操作期间停止。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/atomic-ddl.html" title="第13.1.1节“原子数据定义语句支持”">第13.1.1节“原子数据定义语句支持”一个>.
表空间文件可以在服务器离线时移动或恢复到新的位置<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_directories
选择。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-moving-data-files-offline.html" title="第15.6.3.6节“服务器离线时移动表空间文件”">第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使用量。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_log_buffer_size
变量现在是动态的,这允许在服务器运行时调整日志缓冲区的大小。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/optimizing-innodb-logging.html" title="第8.5.4节,“优化InnoDB重做日志”">第8.5.4节,“优化InnoDB重做日志”一个>.
从MySQL 8.0.12开始,对大对象(LOB)数据的小更新支持undo日志记录,这提高了大小为100字节或更小的LOB更新的性能。以前,LOB更新的大小至少为一个LOB页,这对于可能只修改几个字节的更新来说不是最优的。此增强建立在MySQL 8.0.4中添加的对LOB数据的部分更新的支持之上。
从MySQL 8.0.12开始,算法=即时
支持以下操作<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">ALTER TABLE
操作:
添加列。这个特性也被称为”即时添加一列
”.限制适用。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-online-ddl-operations.html" title="第15.12.1节“联机DDL操作”">第15.12.1节“联机DDL操作”一个>.
添加或删除虚拟列。
添加或删除列默认值。
修改an的定义<一个class="link" href="//www.delbede.com/doc/refman/en/enum.html" title="">枚举
或<一个class="link" href="//www.delbede.com/doc/refman/en/set.html" title="">集
列。
更改索引类型。
重命名表。
支持的操作算法=即时
只修改数据字典中的元数据。表上没有元数据锁,表数据不受影响,因此操作是即时的。如果没有明确指定,算法=即时
默认情况下由支持它的操作使用。如果算法=即时
指定但不支持,则操作立即失败并出现错误。
有关支持的操作的详细信息算法=即时
,请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-online-ddl-operations.html" title="第15.12.1节“联机DDL操作”">第15.12.1节“联机DDL操作”一个>.
从MySQL 8.0.13开始易被诱惑的
存储引擎支持二进制大对象(BLOB)类型列的存储。这个增强提高了使用包含BLOB数据的临时表的查询的性能。以前,包含BLOB数据的临时表存储在定义的磁盘存储引擎中<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">internal_tmp_disk_storage_engine
.有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/internal-temporary-tables.html" title="第8.4.4节,MySQL内部临时表的使用">第8.4.4节,MySQL内部临时表的使用一个>.
从MySQL 8.0.13开始InnoDB
静态数据加密特性支持一般的表空间。以前,只能对每个表一个文件的表空间进行加密。为了支持一般表空间的加密,<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建表空间
和<一个class="link" href="//www.delbede.com/doc/refman/en/alter-tablespace.html" title="">修改表空间
语法被扩展为包含加密
条款。
的<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tablespaces-table.html" title="">INFORMATION_SCHEMA。INNODB_TABLESPACES
表现在包括加密
表示表空间是否加密的列。
的Stage /innodb/alter tablespace(加密)
添加了性能模式阶段工具以允许监视一般表空间加密操作。
禁用innodb_buffer_pool_in_core_file
变量通过排除来减小核心文件的大小InnoDB
缓冲池页面。要使用这个变量<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">core_file
变量必须启用,并且操作系统必须支持MADV_DONTDUMP
的非posix扩展madvise ()
,在Linux 3.4及更高版本中支持。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-buffer-pool-in-core-file.html" title="第15.8.3.7节"从核心文件中排除缓冲池页"">第15.8.3.7节"从核心文件中排除缓冲池页"一个>.
从MySQL 8.0.13开始,用户创建的临时表和优化器创建的内部临时表存储在会话临时表空间中,这些表空间是从临时表空间池中分配给会话的。当会话断开连接时,它的临时表空间将被截断并释放回池。在以前的版本中,临时表是在全局临时表空间(ibtmp1
),它在删除临时表后不会将磁盘空间返回给操作系统。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_temp_tablespaces_dir
变量定义了创建会话临时表空间的位置。默认位置是# innodb_temp
目录下的数据。
的<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-session-temp-tablespaces-table.html" title="">INNODB_SESSION_TEMP_TABLESPACES
Table提供关于会话临时表空间的元数据。
全局临时表空间(ibtmp1
)现在存储对用户创建的临时表所做更改的回滚段。
从MySQL 8.0.14开始,InnoDB
支持并行集群索引读取,这可以改进<一个class="link" href="//www.delbede.com/doc/refman/en/check-table.html" title="">检查表
的性能。此特性不适用于辅助索引扫描。的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_parallel_read_threads
会话变量必须设置为大于1的值,才能发生并行集群索引读取。默认值为4。用于执行并行聚类索引读取的实际线程数由<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_parallel_read_threads
设置要扫描的索引子树的数量,以较小者为准。
从8.0.14开始,当<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_dedicated_server
变量,则根据自动配置的缓冲池大小配置日志文件的大小和数量。以前,日志文件的大小是根据服务器上检测到的内存大小来配置的,没有自动配置日志文件的数量。
从8.0.14开始,添加数据文件
条款<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建表空间
语句是可选的,它允许没有<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">文件
创建表空间的权限。一个<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建表空间
语句执行时没有添加数据文件
子句隐式地创建具有唯一文件名的表空间数据文件。
缺省情况下,当TempTable存储引擎占用的内存量超过定义的内存限制时<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_max_ram
变量时,TempTable存储引擎开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始,此行为由<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_use_mmap
变量。禁用<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_use_mmap
导致TempTable存储引擎使用InnoDB
磁盘上的内部临时表代替内存映射文件作为其溢出机制。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/internal-temporary-tables.html" title="内部临时表存储引擎">内部临时表存储引擎一个>.
从MySQL 8.0.16开始,InnoDB
静态数据加密特性支持mysql
系统表空间。的mysql
系统表空间包含mysql
系统数据库和MySQL数据字典表。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-data-encryption.html" title="章节15.13,“InnoDB静态数据加密”">章节15.13,“InnoDB静态数据加密”一个>.
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_spin_wait_pause_multiplier
变量,在MySQL 8.0.16中引入,可以更好地控制线程等待获取互斥锁或rw锁时发生的自旋锁轮询延迟的持续时间。可以对延迟进行更精细的调优,以适应不同处理器架构上PAUSE指令持续时间的差异。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-performance-spin_lock_polling.html" title="第15.8.8节“配置自旋锁轮询”">第15.8.8节“配置自旋锁轮询”一个>.
InnoDB
在MySQL 8.0.17中,通过更好地利用读线程,通过减少在并行扫描期间发生的读线程I/O预取活动,以及通过支持分区并行扫描,提高了大型数据集的并行读线程性能。
并行读线程特性由<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_parallel_read_threads
变量。现在的最大设置是256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。
的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_idle_flush_pct
变量,在MySQL 8.0.18中引入,允许在空闲期间限制页面刷新,这可以帮助延长固态存储设备的使用寿命。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-buffer-pool-flushing.html" title="在空闲期间限制缓冲区刷新">在空闲期间限制缓冲区刷新一个>.
有效的抽样InnoDB
MySQL 8.0.19支持用于生成直方图统计数据的data。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/analyze-table.html" title="直方图统计分析">直方图统计分析一个>.
从MySQL 8.0.20开始,doublewrite缓冲区存储区域驻留在doublewrite文件中。在以前的版本中,存储区域位于系统表空间中。将存储区域移出系统表空间可以减少写延迟,提高吞吐量,并在放置双写缓冲区页面方面提供灵活性。以下系统变量被引入到高级双写缓冲区配置中:
定义doublewrite缓冲区文件目录。
定义双写文件的数目。
定义批处理写入时每个线程的最大双写页面数。
定义要在批处理中写入的双写页面的数量。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-doublewrite-buffer.html" title="第15.6.4节,“双写缓冲区”">第15.6.4节,“双写缓冲区”一个>.
在MySQL 8.0.20中改进了争用感知事务调度(CATS)算法,该算法对等待锁的事务进行优先级排序。事务调度权重计算现在完全在单独的线程中执行,这提高了计算性能和准确性。
也被用于事务调度的先进先出(FIFO)算法被删除。通过CATS算法的改进,FIFO算法变得冗余。以前由FIFO算法执行的事务调度现在由CATS算法执行。
一个TRX_SCHEDULE_WEIGHT
列被添加到INFORMATION_SCHEMA。INNODB_TRX
表,它允许查询由CATS算法分配的事务调度权重。
以下INNODB_METRICS
增加了用于监视代码级事务调度事件的计数器:
lock_rec_release_attempts
尝试释放记录锁的次数。
lock_rec_grant_attempts
尝试授予记录锁的次数。
lock_schedule_refreshes
分析等待图以更新事务调度权重的次数。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-transaction-scheduling.html" title="第15.7.6节,“事务调度”">第15.7.6节,“事务调度”一个>.
从MySQL 8.0.21开始,为了提高需要访问表和行资源的锁队列的操作的并发性,锁系统互斥锁(lock_sys - >互斥
)被切分锁存器取代,锁队列被分组为表和页锁队列碎片,每个分片由专用互斥锁保护。以前,单锁系统互斥锁保护所有锁队列,这在高并发系统上是一个争用点。新的分片实现允许对锁队列进行更细粒度的访问。
锁系统互斥锁(lock_sys - >互斥
)被以下切分锁扣所取代:
全局锁存器(lock_sys - > latches.global_latch
),包含64个读写锁对象(rw_lock_t
).访问单个锁队列需要共享全局锁存器和锁队列分片上的锁存器。需要访问所有锁队列的操作采用独占全局锁存,锁存所有表和页锁队列分片。
表碎片锁存(lock_sys - > latches.table_shards.mutexes
),实现为一个包含512个互斥锁的数组,每个互斥锁专用于512个表锁队列分片中的一个。
页面碎片锁存(lock_sys - > latches.page_shards.mutexes
),实现为一个包含512个互斥锁的数组,每个互斥锁专用于512个页锁队列分片中的一个。
性能模式等待/同步/ / innodb / lock_mutex互斥
监控单锁系统互斥锁的工具被监控新的全局锁存器、表分片锁存器和页分片锁存器的工具所取代:
等待/同步/ sxlock / innodb / lock_sys_global_rw_lock
等待/同步/ / innodb / lock_sys_table_mutex互斥
等待/同步/ / innodb / lock_sys_page_mutex互斥
从MySQL 8.0.21开始,在数据目录之外创建的表和表分区数据文件使用数据目录
子句限制在已知的目录中InnoDB
.这个更改允许数据库管理员控制在哪里创建表空间数据文件,并确保在恢复过程中可以找到这些数据文件。
通用和每个表文件的表空间数据文件(.ibd
不能再在undo tablespace目录(<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_undo_directory
),除非直接知道InnoDB
.
定义的目录<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">datadir
,<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_data_home_dir
,<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_directories
变量。
删除一个InnoDB
位于每个表文件表空间中的表删除现有表空间并创建一个新的表空间。从MySQL 8.0.21开始,InnoDB
在默认位置创建新的表空间,如果当前表空间目录未知,则向错误日志中写入警告。有<一个class="link" href="//www.delbede.com/doc/refman/en/truncate-table.html" title="">截断表
在当前位置创建表空间,将目录添加到<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_directories
运行前设置<一个class="link" href="//www.delbede.com/doc/refman/en/truncate-table.html" title="">截断表
.
从MySQL 8.0.21开始,重做日志可以启用和禁用<一个class="link" href="//www.delbede.com/doc/refman/en/alter-instance.html" title="">修改实例{enable | disable} innodb redo_log
语法。此功能用于将数据加载到新的MySQL实例中。禁用重做日志可以避免重做日志写入,从而加快数据加载速度。
新<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">INNODB_REDO_LOG_ENABLE
特权允许启用和禁用重做日志记录。
新<一个class="link" href="//www.delbede.com/doc/refman/en/server-status-variables.html">Innodb_redo_log_enabled
状态变量允许监视重做日志记录状态。
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-redo-log.html" title="禁用重做日志">禁用重做日志一个>.
在启动时,InnoDB
在表空间文件被移动到不同位置的情况下,根据存储在数据字典中的表空间文件路径验证已知表空间文件的路径。新<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_validate_tablespace_paths
变量,在MySQL 8.0.21中引入,允许禁用表空间路径验证。该特性适用于不移动表空间文件的环境。在具有大量表空间文件的系统上,禁用表空间路径验证可以缩短启动时间。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-disabling-tablespace-path-validation.html" title="第15.6.3.7节“禁用表空间路径验证”">第15.6.3.7节“禁用表空间路径验证”一个>.
从MySQL 8.0.21开始,在支持原子DDL的存储引擎上<一个class="link" href="//www.delbede.com/doc/refman/en/create-table-select.html" title="">创建表…选择
语句在使用基于行的复制时作为一个事务记录在二进制日志中。以前,它被记录为两个事务,一个用于创建表,另一个用于插入数据。有了这个变化,<一个class="link" href="//www.delbede.com/doc/refman/en/create-table-select.html" title="">创建表…选择
语句现在可以安全地用于基于行的复制,并允许用于基于gtid的复制。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/atomic-ddl.html" title="第13.1.1节“原子数据定义语句支持”">第13.1.1节“原子数据定义语句支持”一个>.
在繁忙的系统上截断撤消表空间可能会影响性能,因为相关的刷新操作会从缓冲池中删除旧的撤消表空间页,并将新撤消表空间的初始页刷新到磁盘。为了解决这个问题,MySQL 8.0.21删除了刷新操作。
旧的undo表空间页在最近最少使用时被被动释放,或者在下一个完整的检查点时被删除。新的undo表空间的初始页现在被重做记录,而不是在截断操作期间刷新到磁盘,这也提高了undo表空间截断操作的持久性。
为了防止过多的撤销表空间截断操作引起的潜在问题,检查点之间对同一撤销表空间的截断操作现在限制为64。如果超过了限制,撤销表空间仍然可以处于非活动状态,但是直到下一个检查点之后才会被截断。
INNODB_METRICS
已删除与已失效的撤消截断刷新操作相关联的计数器。移除的计数器包括:undo_truncate_sweep_count
,undo_truncate_sweep_usec
,undo_truncate_flush_count
,undo_truncate_flush_usec
.
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-undo-tablespaces.html" title="第15.6.3.4节“撤销表空间”">第15.6.3.4节“撤销表空间”一个>.
从MySQL 8.0.22开始,新的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_extend_and_initialize
变量允许配置如何InnoDB
在Linux上为每表文件和一般表空间分配空间。默认情况下,当一个操作需要额外的表空间时,InnoDB
为表空间分配页面,并物理地将null写入这些页面。如果频繁地分配新页面,这种行为会影响性能。你可以禁用<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_extend_and_initialize
在Linux系统上避免物理地将null写入新分配的表空间页。当<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_extend_and_initialize
被禁用,使用posix_fallocate ()
调用,它保留空间而不实际写入null。
一个posix_fallocate ()
操作不是原子的,这使得在为表空间文件分配空间和更新文件元数据之间可能发生失败。这样的失败可能会使新分配的页面处于未初始化状态,从而导致失败InnoDB
尝试访问这些页面。为了防止这种情况发生,InnoDB
在分配新的表空间页之前写重做日志记录。如果页面分配操作被中断,则在恢复期间从重做日志记录中重播该操作。
从MySQL 8.0.23开始,InnoDB
支持加密属于加密表空间的doublewrite文件页面。使用关联表空间的加密密钥对页面进行加密。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-data-encryption.html" title="章节15.13,“InnoDB静态数据加密”">章节15.13,“InnoDB静态数据加密”一个>.
的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_max_mmap
变量,在MySQL 8.0.23中引入,定义了TempTable存储引擎在开始将内部临时表数据存储在磁盘上之前,允许从内存映射(MMAP)文件分配的最大内存量。设置为0禁用从MMAP文件进行分配。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/internal-temporary-tables.html" title="第8.4.4节,MySQL内部临时表的使用">第8.4.4节,MySQL内部临时表的使用一个>.
的AUTOEXTEND_SIZE
选项,在MySQL 8.0.23中引入,定义了InnoDB
当表空间满时扩展它的大小,从而可以以更大的增量扩展表空间大小。的AUTOEXTEND_SIZE
选项支持<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建表
,<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">ALTER TABLE
,<一个class="link" href="//www.delbede.com/doc/refman/en/create-tablespace.html" title="">创建表空间
,<一个class="link" href="//www.delbede.com/doc/refman/en/alter-tablespace.html" title="">修改表空间
语句。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-tablespace-autoextend-size.html" title="第15.6.3.9节,“表空间AUTOEXTEND_SIZE配置”">第15.6.3.9节,“表空间AUTOEXTEND_SIZE配置”一个>.
一个AUTOEXTEND_SIZE
的大小列被添加到<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tablespaces-table.html" title="">INFORMATION_SCHEMA。INNODB_TABLESPACES
表格
字符集支持。默认字符集已从latin1
来utf8mb4
.的utf8mb4
字符集有几个新的排序规则,包括utf8mb4_ja_0900_as_cs
,这是MySQL中第一个针对Unicode的日语特定排序。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/charset-unicode-sets.html" title="第10.10.1节,“Unicode字符集”">第10.10.1节,“Unicode字符集”一个>.
JSON的增强。以下是对MySQL JSON功能的增强或添加:
添加了<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">->>
(inline path)操作符,相当于调用<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_UNQUOTE ()
的结果<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_EXTRACT ()
.
这是列路径运算符的细化<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">->
在MySQL 5.7中引入;col - > >“.path美元”
等于JSON_UNQUOTE (col - >“.path美元”)
.内联路径操作符可以在任何可以使用的地方使用JSON_UNQUOTE (JSON_EXTRACT ())
,这样的<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
列清单,在哪里
和有
条款,命令
和集团
条款。有关更多信息,请参阅操作符的描述,以及<一个class="xref" href="//www.delbede.com/doc/refman/en/json.html" title="JSON路径语法">JSON路径语法一个>.
增加了两个JSON聚合函数<一个class="link" href="//www.delbede.com/doc/refman/en/aggregate-functions.html">JSON_ARRAYAGG ()
和<一个class="link" href="//www.delbede.com/doc/refman/en/aggregate-functions.html">JSON_OBJECTAGG ()
.JSON_ARRAYAGG ()
将列或表达式作为其参数,并将结果聚合为单个<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
数组中。表达式可以计算为任何MySQL数据类型;这个不一定是aJSON
价值。JSON_OBJECTAGG ()
接受两个列或表达式,并将其解释为键和值;它将结果作为单个返回JSON
对象。有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/aggregate-functions-and-modifiers.html" title="第12.20节,“聚合函数”">第12.20节,“聚合函数”一个>.
增加JSON实用功能<一个class="link" href="//www.delbede.com/doc/refman/en/json-utility-functions.html">JSON_PRETTY ()
,它输出一个已存在的<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
以易于阅读的格式显示价值;每个JSON对象成员或数组值打印在单独的行上,子对象或数组相对于其父对象或数组有2个空格。
此函数还可以处理可解析为JSON值的字符串。
有关更详细的信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-utility-functions.html" title="第12.18.8节," JSON实用函数"">第12.18.8节," JSON实用函数"一个>.
当排序<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
查询中的值命令
,每个值现在由排序键的可变长度部分表示,而不是固定大小的1K部分。在许多情况下,这可以减少过度使用。例如,标量INT
甚至长整型数字
Value实际上只需要很少的字节,因此该空间的剩余部分(最多90%或更多)被填充占用。此更改对性能有以下好处:
现在可以更有效地使用排序缓冲区空间,因此文件排序不需要像使用固定长度的排序键那样早或经常刷新到磁盘。这意味着可以在内存中对更多的数据进行排序,从而避免不必要的磁盘访问。
较短的键可以比较长的键更快地进行比较,从而显著提高性能。对于完全在内存中执行的排序以及需要从磁盘写入和读取的排序都是如此。
在MySQL 8.0.2中增加了对的局部、就地更新的支持JSON
列值,这比完全删除现有的JSON值并在其位置写入新值更有效,就像以前在更新任何JSON值时所做的那样JSON
列。要应用此优化,必须使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_SET ()
,<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_REPLACE ()
,或<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_REMOVE ()
.不能将新元素添加到正在更新的JSON文档中;文档中的值不能占用比更新前更多的空间。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/json.html" title="JSON值的部分更新">JSON值的部分更新一个>,以详细讨论有关的需求。
JSON文档的部分更新可以写入二进制日志,比记录完整的JSON文档占用更少的空间。在使用基于语句的复制时,总是记录部分更新。若要使用基于行的复制,您必须首先设置<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-binary-log.html">binlog_row_value_options = PARTIAL_JSON
;有关更多信息,请参阅该变量的描述。
增加JSON实用函数<一个class="link" href="//www.delbede.com/doc/refman/en/json-utility-functions.html">JSON_STORAGE_SIZE ()
和<一个class="link" href="//www.delbede.com/doc/refman/en/json-utility-functions.html">JSON_STORAGE_FREE ()
.JSON_STORAGE_SIZE ()
以字节为单位返回在任何部分更新之前用于JSON文档二进制表示的存储空间(参见上一项)。JSON_STORAGE_FREE ()
类型的表列中剩余的空间量<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
在使用。进行部分更新之后JSON_SET ()
或JSON_REPLACE ()
;如果新值的二进制表示小于前一个值的二进制表示,则该值大于零。
这些函数还接受JSON文档的有效字符串表示形式。对于这样的值,JSON_STORAGE_SIZE ()
返回其二进制表示形式转换为JSON文档后使用的空间。对于包含JSON文档的字符串表示的变量,JSON_STORAGE_FREE ()
返回零。如果不能将其(非空)参数解析为有效的JSON文档,则这两个函数都会产生错误零
如果参数是零
.
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-utility-functions.html" title="第12.18.8节," JSON实用函数"">第12.18.8节," JSON实用函数"一个>.
JSON_STORAGE_SIZE ()
和JSON_STORAGE_FREE ()
在MySQL 8.0.2中实现。
在MySQL 8.0.2中增加了对范围的支持,例如$[1至5]
在XPath表达式中。在这个版本中还增加了对最后的
关键字和相对寻址,这样美元(去年)
总是选择数组中最后一个(编号最高的)元素和美元(持续1)
倒数第二个元素。最后的
使用它的表达式也可以包含在范围定义中。例如,$[最后2到最后1]
返回数组中除一个元素外的最后两个元素。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/json.html" title="查询和修改JSON值">查询和修改JSON值一个>,以获取更多信息和示例。
添加了一个JSON合并函数,旨在符合<一个class="ulink" href="https://tools.ietf.org/html/rfc7396" target="_top">RFC 7396一个>.<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE_PATCH ()
,当在2个JSON对象上使用时,将它们合并为一个JSON对象,该对象具有以下集合的联合成员:
在第二个对象中没有具有相同键的成员的第一个对象的每个成员。
第二个对象的每个成员,其在第一个对象中没有具有相同键的成员,并且其值不是JSON零
文字。
每个成员都有一个键,该键存在于两个对象中,并且其在第二个对象中的值不是JSON零
文字。
作为这项工作的一部分<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE ()
函数已重命名<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE_PRESERVE ()
.JSON_MERGE ()
一直被认为是JSON_MERGE_PRESERVE ()
在MySQL 8.0中,但现在已弃用,并可能在MySQL的未来版本中删除。
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-modification-functions.html" title="第12.18.4节“修改JSON值的函数”">第12.18.4节“修改JSON值的函数”一个>.
实现”最后一个重复键获胜”重复键的规范化,与<一个class="ulink" href="https://tools.ietf.org/html/rfc7159" target="_top">RFC 7159一个>以及大多数JavaScript解析器。下面展示了这种行为的一个示例,其中只有最右边的成员拥有键x
保存:
mysql >选择JSON_OBJECT(“x”、“32”、“y”,(真、假),>‘x’,‘“abc”’,‘x’,‘100’)的结果;+------------------------------------+ | 结果 | +------------------------------------+ | {" x”:“100”、“y”:“(真的,假的 ]"} | +------------------------------------+ 1行集(0.00秒)
插入MySQL的值<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
列也以这种方式规范化,如下例所示:
创建表t1 (c1 JSON)mysql >插入t1值(“{“x”:17,“x”:“红色”,“x”:[3、5、7]}”);mysql mysql数据库:+------------------+ | c1 | +------------------+ | {" x”:[3、5、7 ]} | +------------------+
这是与以前版本的MySQL不兼容的更改”第一个重复键获胜”在这种情况下使用算法。
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/json.html" title="JSON值的规范化、合并和自动包装">JSON值的规范化、合并和自动包装一个>,以获取更多信息和示例。
添加了<一个class="link" href="//www.delbede.com/doc/refman/en/json-table-functions.html">JSON_TABLE ()
在MySQL 8.0.4中。该函数接受JSON数据,并将其作为具有指定列的关系表返回。
该函数具有语法JSON_TABLE (
,在那里expr
,路径
列column_list
) ()别名
)expr
是一个返回JSON数据的表达式,路径
是一个JSON路径应用到源,和column_list
列定义的列表。下面是一个例子:
mysql >SELECT *->从->JSON_TABLE (->({“a”:3,“b”:“0”},{“a”:“3”、“b”:“1”},{“b”,“a”:2:1},{“a”:0},{b:[1, 2]}]”,->“[*]美元”列(->渴望平凡,-> ->/ / / / / / / / / /->/ / $.b / /-> ->* * * * * * * * * *->返回$.b的路径-> ->j_json PATH "$.a",->JSON路径"$.b"->)->) AS jt1;+-------+------+------+------+------+------+--------+ | rowid | xa | xb | sa |某人|是|简森-巴顿 | +-------+------+------+------+------+------+--------+ | 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 |空零| | 0 | | 5 | 0 | 1 |空零零| | |(1、2 ] | +-------+------+------+------+------+------+--------+
JSON源表达式可以是产生有效JSON文档的任何表达式,包括JSON文字、表列或返回JSON的函数调用,例如<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_EXTRACT(t1, data, '$.post.comments')
.有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-table-functions.html" title="第12.18.6节,“JSON表函数”">第12.18.6节,“JSON表函数”一个>.
数据类型支持。米ySQL现在支持在数据类型规范中使用表达式作为默认值。方法的默认值包括使用表达式<一个class="link" href="//www.delbede.com/doc/refman/en/blob.html" title="">团
,<一个class="link" href="//www.delbede.com/doc/refman/en/blob.html" title="">文本
,几何
,<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
数据类型,以前根本不能为其分配默认值。有关详情,请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/data-type-defaults.html" title="第11.6节“数据类型默认值”">第11.6节“数据类型默认值”一个>.
优化器。增加了以下优化器增强功能:
MySQL现在支持不可见索引。不可见的索引根本不被优化器使用,而是正常维护。默认情况下索引是可见的。使用不可见的索引可以测试删除索引对查询性能的影响,而不必进行破坏性的更改,如果发现需要索引,就必须撤消该更改。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/invisible-indexes.html" title="第8.3.12节“不可见的索引”">第8.3.12节“不可见的索引”一个>.
MySQL现在支持降序索引:DESC
在索引中,定义不再被忽略,而是导致按降序存储键值。以前,索引可以按相反的顺序扫描,但会降低性能。降序索引可以按正向顺序扫描,这样效率更高。降序索引还使优化器可以在最有效的扫描顺序混合了某些列的升序和其他列的降序时使用多列索引。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/descending-indexes.html" title="第8.3.13节“降序索引”">第8.3.13节“降序索引”一个>.
MySQL现在支持创建函数索引键部分,索引表达式值而不是列值。功能关键部件支持对其他方式无法索引的值进行索引,例如<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
值。有关详情,请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/create-index.html" title="第13.1.15节," CREATE INDEX语句"">第13.1.15节," CREATE INDEX语句"一个>.
在MySQL 8.0.14和更高版本中,微不足道在哪里
由常量文字表达式产生的条件在准备过程中删除,而不是在优化过程中删除。在过程的早期删除条件使得有可能简化具有琐碎条件的外部连接查询的连接,例如下面这个:
从t1左连接t2condition_1在哪里condition_2或者0 = 1
优化器现在在准备过程中看到0 = 1总是假的,这使得或者0 = 1
冗余,并删除它,留下如下:
从t1左连接t2condition_1在哪里condition_2
现在优化器可以将查询重写为内部连接,如下所示:
SELECT * FROM t1左连接t2 WHEREcondition_1和condition_2
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/outer-join-optimization.html" title="第8.2.1.9节,“外连接优化”">第8.2.1.9节,“外连接优化”一个>.
在MySQL 8.0.16和更高版本中,MySQL可以在优化时使用常量折叠来处理列和常量值之间的比较,当常量超出列类型的范围或在范围边界上时,而不是在执行时对每一行进行比较。例如,给定一个表t
与一个非常小的整数无符号
列c
,优化器可以重写条件,如当c < 256
来在1
(并完全优化条件),或者WHERE c >= 255
来当c = 255
.
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/constant-folding-optimization.html" title="第8.2.1.14节,“常数折叠优化”">第8.2.1.14节,“常数折叠优化”一个>,以获取更多资讯。
从MySQL 8.0.16开始,使用的半连接优化在
子查询现在可以应用于存在
子查询也是如此。类中无关紧要的相等谓词的解关联在哪里
条件附加到子查询,以便它们可以类似于中的表达式处理在
子查询;这对两者都适用存在
和在
子查询。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/semijoins.html" title="第8.2.2.1节“使用半连接转换优化IN和EXISTS子查询谓词”">第8.2.2.1节“使用半连接转换优化IN和EXISTS子查询谓词”一个>.
从MySQL 8.0.17开始,服务器会重写任何不完整的SQL谓词(即具有在哪里
,其中价值
价值
列名或常量表达式(不使用比较运算符)内部为在哪里
在上下文化阶段,以便查询解析器、查询优化器和查询执行器只需要使用完整的谓词。价值
< > 0
这种变化的一个明显影响是,对于布尔值,<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释
现在显示输出真正的
和假
,而不是1
和0
.
此更改的另一个影响是,在SQL布尔上下文中计算JSON值时会执行与JSON整数0的隐式比较。考虑如下所示创建和填充的表:
创建test表(id INT, col JSON)mysql >插入测试值(“{“val”:真}”),(2,'{“val”:假}');
之前,服务器试图转换提取的真正的
或假
值在SQL布尔上下文中进行比较时,将值设置为SQL布尔值,如下面的查询所示是真的
:
mysql> SELECT id, col, col->"$。返回" FROM test WHERE col->"$。val”为真;+------+---------------+--------------+ | id | |上校上校——>“美元。瓦尔 " | +------+---------------+--------------+ | 1 |{“val”:真}|真的 | +------+---------------+--------------+
在MySQL 8.0.17及更高版本中,将提取的值与JSON整数0进行隐式比较会导致不同的结果:
mysql> SELECT id, col, col->"$。返回" FROM test WHERE col->"$。val”为真;+------+----------------+--------------+ | id | |上校上校——>“美元。瓦尔 " | +------+----------------+--------------+ | 1 |{“val”:真}真正| | | 2 |{“val”:假}|假 | +------+----------------+--------------+
从MySQL 8.0.21开始,可以使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_VALUE ()
对提取的值进行类型转换,然后再执行测试,如下所示:
mysql> SELECT id, col, col->"$。WHERE JSON_VALUE(col, "$。val(返回UNSIGNED)为真;+------+---------------+--------------+ | id | |上校上校——>“美元。瓦尔 " | +------+---------------+--------------+ | 1 |{“val”:真}|真的 | +------+---------------+--------------+
同样从MySQL 8.0.21开始,服务器提供警告在SQL布尔上下文中计算JSON值与JSON整数0进行隐式比较;如果这不是您想要的,请考虑使用JSON_VALUE RETURNING将JSON转换为SQL数字类型在以这种方式比较SQL布尔上下文中提取的值时。
在MySQL 8.0.17及以后的版本中在哪里
条件有不在(
或子查询
)不存在(
在内部转换为反连接。(反连接返回表中没有符合连接条件的行。)这将删除子查询,这可以导致更快的查询执行,因为子查询的表现在在顶层处理。子查询
)
这类似并重用了现有的为空
(不存在
)外连接优化;看到<一个class="xref" href="//www.delbede.com/doc/refman/en/explain-output.html" title="解释额外信息">解释额外信息一个>.
从MySQL 8.0.21开始,一个单表<一个class="link" href="//www.delbede.com/doc/refman/en/update.html" title="">更新
或<一个class="link" href="//www.delbede.com/doc/refman/en/delete.html" title="">删除
语句现在可以在许多情况下使用半连接转换或子查询实体化。这适用于下列形式的语句:
UPDATE t1 SET t1.a=
价值
在t1。一个(选择t2.a FROM t2)
DELETE FROM t1 WHERE t1。1 . SELECT (SELECT)a FROM t2)
这可以用于单个表更新
或删除
满足以下条件:
的更新
或删除
语句使用具有(不)
或(不)存在
谓词。
声明中没有命令
子句,并无限制
条款。
的多表版本更新
和删除
不支持命令
或限制
.)
目标表不支持写前读删除(仅与<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-cluster.html" title="">NDB
表)。
基于子查询中包含的任何提示和的值,允许实现半连接或子查询<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">optimizer_switch
.
当对符合条件的单表使用半连接优化时删除
或更新
,这在优化器跟踪中是可见的:对于多表语句,有一个join_optimization
对象,而对于单表语句则没有。的输出中也可以看到转换解释格式=树
或<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释分析
;显示一个单表语句<不能被迭代器执行器>执行
,而多表语句则报告完整的计划。
同样从MySQL 8.0.21开始,多表支持半一致读更新
语句的使用<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-storage-engine.html" title="">InnoDB
表,用于事务隔离级别弱于<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-transaction-isolation-levels.html">可重复读取
.
改进的散列连接性能。米ySQL 8.0.23重新实现了用于哈希连接的哈希表,从而提高了哈希连接的性能。这项工作包括修复了一个问题(Bug #31516149, Bug #99933),即只有大约2/3的内存分配给连接缓冲区(<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">join_buffer_size
)实际上可以由散列连接使用。
新的哈希表通常比旧的哈希表快,并且在对齐、键/值以及有许多相同键的情况下使用更少的内存。此外,当哈希表的大小增加时,服务器现在可以释放旧内存。
常见的表表达式。米ySQL现在支持常见的表表达式,包括非递归和递归。公共表表达式支持使用命名的临时结果集,通过允许<一个class="link" href="//www.delbede.com/doc/refman/en/with.html" title="">与
条款前<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
陈述和某些其他陈述。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/with.html" title="第13.2.15节“WITH(公共表表达式)”">第13.2.15节“WITH(公共表表达式)”一个>.
从MySQL 8.0.19开始,递归<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
递归公共表表达式(CTE)的一部分支持限制
条款。限制
与抵消
也支持。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/with.html" title="递归公共表表达式">递归公共表表达式一个>,以获取更多资讯。
窗口函数。米ySQL现在支持窗口函数,对于查询中的每一行,使用与该行相关的行执行计算。这些函数包括<一个class="link" href="//www.delbede.com/doc/refman/en/window-function-descriptions.html">排名()
,<一个class="link" href="//www.delbede.com/doc/refman/en/window-function-descriptions.html">滞后()
,<一个class="link" href="//www.delbede.com/doc/refman/en/window-function-descriptions.html">NTILE ()
.此外,一些现有的聚合函数现在可以用作窗口函数(例如,<一个class="link" href="//www.delbede.com/doc/refman/en/aggregate-functions.html">SUM ()
和<一个class="link" href="//www.delbede.com/doc/refman/en/aggregate-functions.html">AVG ()
).有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/window-functions.html" title="第12.21节“窗口函数”">第12.21节“窗口函数”一个>.
横向派生表。派生表的前面现在可以有横向
关键字来指定允许引用(依赖于)前面表的列从
条款。横向派生表使某些SQL操作成为可能,这些操作无法使用非横向派生表完成,或者需要效率较低的变通方法。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/lateral-derived-tables.html" title="第13.2.11.9节“横向派生表”">第13.2.11.9节“横向派生表”一个>.
单表DELETE语句中的别名。在MySQL 8.0.16及以后版本中,支持单表<一个class="link" href="//www.delbede.com/doc/refman/en/delete.html" title="">删除
语句支持使用表别名。
正则表达式支持。以前,MySQL使用Henry Spencer正则表达式库来支持正则表达式操作符(<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">正则表达式
,<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">RLIKE
).正则表达式支持已经使用Unicode国际组件(ICU)重新实现,它提供了完整的Unicode支持并且是多字节安全的。的<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">REGEXP_LIKE ()
的方式执行正则表达式匹配<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">正则表达式
和<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">RLIKE
操作符,现在是该函数的同义词。此外,<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">REGEXP_INSTR ()
,<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">REGEXP_REPLACE ()
,<一个class="link" href="//www.delbede.com/doc/refman/en/regexp.html">REGEXP_SUBSTR ()
函数分别用于查找匹配位置、执行子字符串替换和提取。的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">regexp_stack_limit
和<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">regexp_time_limit
系统变量为匹配引擎提供对资源消耗的控制。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/regexp.html" title="第12.8.2节,“正则表达式”">第12.8.2节,“正则表达式”一个>.有关使用正则表达式的应用程序可能受到实现更改影响的方式的信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/regexp.html" title="正则表达式兼容性注意事项">正则表达式兼容性注意事项一个>.
内部临时表。的易被诱惑的
存储引擎取代内存
存储引擎作为内存中内部临时表的默认引擎。的易被诱惑的
存储引擎提供高效的存储<一个class="link" href="//www.delbede.com/doc/refman/en/char.html" title="">VARCHAR
和<一个class="link" href="//www.delbede.com/doc/refman/en/binary-varbinary.html" title="">VARBINARY
列。的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">internal_tmp_mem_storage_engine
会话变量定义内存中内部临时表的存储引擎。允许值为易被诱惑的
(默认)和内存
.的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_max_ram
变量定义可使用的最大内存量易被诱惑的
存储引擎可以在数据存储到磁盘之前使用。
日志记录。错误记录被重写以使用MySQL组件架构。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录是作为可加载组件实现的。此外,还有一个可加载的JSON日志写入器。要控制启用哪些日志组件,请使用<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">log_error_services
系统变量。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/error-log.html" title="第5.4.2节“错误日志”">第5.4.2节“错误日志”一个>.
备份锁。一种新型备份锁允许在在线备份期间进行DML,同时防止可能导致快照不一致的操作。支持新的备份锁<一个class="link" href="//www.delbede.com/doc/refman/en/lock-instance-for-backup.html" title="">锁定备份实例
和<一个class="link" href="//www.delbede.com/doc/refman/en/lock-instance-for-backup.html" title="">打开实例
语法。的<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">BACKUP_ADMIN
使用这些语句需要特权。
复制。以下是对MySQL复制的增强:
MySQL Replication现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,这比记录完整的JSON文档节省了日志空间。这种紧凑的日志记录在使用基于语句的日志记录时自动完成,并且可以通过设置newbinlog_row_value_options
系统变量toPARTIAL_JSON
.有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json.html" title="JSON值的部分更新">JSON值的部分更新一个>,以及对…的描述<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-binary-log.html">binlog_row_value_options
.
连接管理。米ySQL服务器现在允许专门为管理连接配置TCP/IP端口。这为用于普通连接的网络接口上允许的单个管理连接提供了一种替代方案,即使在以下情况下也是如此<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">max_connections
联系已经建立起来了。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/connection-interfaces.html" title="第5.1.12.1节“连接接口”">第5.1.12.1节“连接接口”一个>.
MySQL现在对压缩的使用提供了更多的控制,以最小化通过连接发送到服务器的字节数。以前,给定的连接要么未压缩,要么使用zlib
压缩算法。现在,也可以使用zstd
算法,并为其选择压缩级别zstd
连接。允许的压缩算法可以在服务器端配置,也可以在连接发起端配置,用于客户端程序和参与源/副本复制或组复制的服务器的连接。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/connection-compression-control.html" title="第4.2.8节,“连接压缩控制”">第4.2.8节,“连接压缩控制”一个>.
配置。米ySQL允许的主机名的最大长度已经从之前的60个字符的限制提高到255个ASCII字符。例如,这适用于数据字典中与主机名相关的列,mysql
系统模式、性能模式、INFORMATION_SCHEMA
,sys
模式;的MASTER_HOST
的值<一个class="link" href="//www.delbede.com/doc/refman/en/change-master-to.html" title="">将主机更改为
声明;的宿主
列<一个class="link" href="//www.delbede.com/doc/refman/en/show-processlist.html" title="">显示PROCESSLIST
语句输出;帐户名称中的主机名(例如在帐户管理报表和定义者
属性);以及与主机名相关的命令选项和系统变量。
警告:
允许的主机名长度的增加会影响在主机名列上有索引的表。中的表mysql
索引主机名的系统模式现在具有显式的ROW_FORMAT
的属性动态
以适应较长的索引值。
一些以文件名为值的配置设置可能是基于服务器主机名构造的。允许的值受到底层操作系统的限制,它可能不允许文件名长到足以包含255个字符的主机名。这会影响<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">general_log_file
,<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">log_error
,<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">pid_file
,<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-replica.html">relay_log
,<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">slow_query_log_file
系统变量和相应的选项。如果基于主机名的值对于操作系统来说太长,则必须提供显式的较短的值。
虽然服务器现在支持255个字符的主机名,但是使用<一个class="link" href="//www.delbede.com/doc/refman/en/connection-options.html">——ssl-mode = VERIFY_IDENTITY
选项受OpenSSL支持的最大主机名长度的限制。主机名匹配涉及SSL证书的两个字段,其最大长度如下:Common name:最大长度64;主题备选名称:rfc# 1034规定的最大长度。
插件。以前,MySQL插件可以用C或c++编写。插件使用的MySQL头文件现在包含c++代码,这意味着插件必须用c++编写,而不是C。
C API。米ySQL C API现在支持异步函数,用于与MySQL服务器进行非阻塞通信。每个函数都是现有同步函数的异步对应物。如果读取或写入服务器连接必须等待,则同步函数会阻塞。异步函数使应用程序能够检查服务器连接上的工作是否准备好继续。如果没有,应用程序可以在稍后再次检查之前执行其他工作。看到<一个class="ulink" href="//www.delbede.com/doc/c-api/8.0/en/c-api-asynchronous-interface.html" target="_top">C API异步接口一个>.
强制转换的其他目标类型。的函数<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">把()
和<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">将()
现在支持到类型的转换<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">双
,<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">浮动
,<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">真正的
.MySQL 8.0.17新增。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/cast-functions.html" title="第12.11节“强制转换函数和操作符”">第12.11节“强制转换函数和操作符”一个>.
JSON模式验证。米ySQL 8.0.17增加了两个函数<一个class="link" href="//www.delbede.com/doc/refman/en/json-validation-functions.html">JSON_SCHEMA_VALID ()
和<一个class="link" href="//www.delbede.com/doc/refman/en/json-validation-functions.html">JSON_SCHEMA_VALIDATION_REPORT ()
用于验证JSON文档和JSON模式。JSON_SCHEMA_VALID ()
如果文档根据模式进行验证,则返回TRUE(1),否则返回FALSE(0)。JSON_SCHEMA_VALIDATION_REPORT ()
返回一个JSON文档,其中包含有关验证结果的详细信息。下面的语句适用于这两个函数:
该模式必须符合JSON模式规范的Draft 4。
要求
支持属性。
外部资源和$ ref
关键字不支持。
支持正则表达式模式;无效模式将被静默忽略。
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/json-validation-functions.html" title="第12.18.7节,“JSON模式验证函数”">第12.18.7节,“JSON模式验证函数”一个>,以获取更多信息和示例。
多值索引。从MySQL 8.0.17开始,<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-storage-engine.html" title="">InnoDB
支持创建多值索引,这是在类上定义的二级索引<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
存储值数组的列,对于单个数据记录可以有多个索引记录。这样的索引使用关键部分定义,如(数据- >的美元。zipcode(作为UNSIGNED数组)
.多值索引由MySQL优化器自动用于合适的查询,可以在的输出中查看<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释
.
作为这项工作的一部分,MySQL增加了一个新函数<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_OVERLAPS ()
和一个新的<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">成员()
操作操作员<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
文档,另外扩展了<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">把()
带有new的函数数组
关键字,如下表所示:
JSON_OVERLAPS ()
比较两个<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
文档。如果它们包含任何相同的键值对或数组元素,则返回TRUE (1);否则返回FALSE(0)。如果两个值都是标量,则该函数执行一个简单的相等测试。如果一个参数是JSON数组,另一个参数是标量,则标量被视为数组元素。因此,JSON_OVERLAPS ()
作为…的补充<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_CONTAINS ()
.
成员()
测试第一个操作数(标量或JSON文档)是否为作为第二个操作数传递的JSON数组的成员,如果是则返回TRUE(1),如果不是则返回FALSE(0)。不执行操作数的类型转换。
演员(
允许通过转换在JSON文档中找到的JSON数组来创建函数索引表达式
作为类型
数组)json_path
到SQL数组。类型说明符仅限于已支持的类型说明符把()
,除了二进制
(不支持)。的用法把()
(和数组
关键字)仅支持<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-storage-engine.html" title="">InnoDB
,并且仅用于创建多值索引。
有关多值索引的详细信息(包括示例),请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/create-index.html" title="多值的索引">多值的索引一个>.<一个class="xref" href="//www.delbede.com/doc/refman/en/json-search-functions.html" title="第12.18.3节“搜索JSON值的函数”">第12.18.3节“搜索JSON值的函数”一个>,提供有关JSON_OVERLAPS ()
和成员()
,并附有使用示例。
Hintable time_zone。从MySQL 8.0.17开始,<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">time_zone
会话变量提示使用<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">SET_VAR
.
重做日志归档。从MySQL 8.0.17开始,InnoDB
支持重做日志归档。当备份操作正在进行时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,从而导致重做日志记录丢失,因为这些记录被覆盖了。重做日志归档特性通过顺序地将重做日志记录写入归档文件来解决这个问题。备份实用程序可以根据需要从归档文件复制重做日志记录,从而避免潜在的数据丢失。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-redo-log.html" title="重做日志归档">重做日志归档一个>.
克隆插件。从MySQL 8.0.17开始,MySQL提供了一个允许克隆的克隆插件InnoDB
本地或远程MySQL服务器实例的数据。本地克隆操作将克隆的数据存储在MySQL实例运行的同一服务器或节点上。远程克隆操作通过网络将克隆的数据从提供方MySQL服务器实例传输到启动克隆操作的接收方服务器或节点。
克隆插件支持复制。除了克隆数据之外,克隆操作还可以从供体提取和传输复制坐标,并将其应用于接收方,这样就可以使用克隆插件来供应Group replication成员和副本。使用克隆插件进行配置比复制大量事务要快得多,效率也高得多。还可以将Group Replication成员配置为使用克隆插件作为恢复的替代方法,以便成员自动选择最有效的方式从种子成员中检索组数据。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/clone-plugin.html" title="第5.6.7节,“克隆插件”">第5.6.7节,“克隆插件”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/group-replication-cloning.html" title="第18.5.3.2节“克隆用于分布式恢复”">第18.5.3.2节“克隆用于分布式恢复”一个>.
哈希连接优化。从MySQL 8.0.18开始,只要连接中的每对表至少包含一个相等连接条件,并且没有索引应用于任何连接条件,就使用散列连接。散列连接不需要索引,尽管它可以用于仅应用于单表谓词的索引。在大多数情况下,散列连接比块嵌套循环算法更有效。像这里所示的连接可以通过这种方式进行优化:
SELECT * FROM t1.c1=t2.c1SELECT * FROM t1 JOIN t2 ON t1。C1 = t2。c1和t1。c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1)
散列连接也可以用于笛卡尔积—也就是说,在没有指定连接条件的情况下。
您可以查看何时将散列连接优化用于特定查询<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释格式=树
或<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释分析
.(在MySQL 8.0.20及以后的版本中,你也可以使用解释
,省略格式=树
.)
的值限制了散列连接可用的内存量<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">join_buffer_size
.在磁盘上执行需要超过此内存的散列连接;磁盘上散列连接可以使用的磁盘文件数量受以下限制<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">open_files_limit
.
从MySQL 8.0.19开始,<一个class="link" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html">hash_join
在MySQL 8.0.18中引入的优化器开关不再支持(hash_join=on仍然作为optimizer_switch值的一部分出现,但设置它不再有任何影响)。的<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">HASH_JOIN
和NO_HASH_JOIN
优化器提示也不再受支持。开关和提示现在都已弃用;希望它们在未来的MySQL版本中被删除。在MySQL 8.0.18及以后的版本中,可以使用<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_BNL
优化器开关。
在MySQL 8.0.20及更高版本中,MySQL服务器不再使用块嵌套循环,并且在以前使用块嵌套循环的任何时候都使用散列连接,即使查询不包含等同连接条件。这适用于内非等连接、半连接、反连接、左外连接和右外连接。鸟儿排成一队<一个class="link" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html">block_nested_loop
的标志<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">optimizer_switch
系统变量以及<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">BNL
和NO_BNL
优化器提示仍然受支持,但从此以后只控制散列连接的使用。此外,内部连接和外部连接(包括半连接和反连接)现在都可以使用批处理键访问(BKA),它以增量方式分配连接缓冲内存,这样单个查询就不必耗尽它们实际上不需要的大量资源来进行解析。从MySQL 8.0.18开始,只支持内部连接的BKA。
MySQL 8.0.20还用迭代器执行器取代了以前版本MySQL中使用的执行器。这项工作包括替换管理表单查询的旧索引子查询引擎在哪里
对于那些价值
(选择列
从表格
在哪里…)在
未被优化为半连接的查询,以及以相同形式具体化的查询,这些查询以前依赖于旧的执行器。
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/hash-joins.html" title="第8.2.1.4节,“哈希连接优化”">第8.2.1.4节,“哈希连接优化”一个>.另请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/bnl-bka-optimization.html" title="批处理键访问连接">批处理键访问连接一个>.
解释分析语句。一种新形式的<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释
声明中,<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释分析
,在MySQL 8.0.18中实现,提供了关于<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
语句树
为处理查询中使用的每个迭代器设置格式,并使其能够比较查询的估计成本与实际成本。这些信息包括启动成本、总成本、该迭代器返回的行数以及执行的循环次数。
在MySQL 8.0.21及以后的版本中,该语句还支持格式=树
说明符。树
是唯一支持的格式。
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/explain.html" title="用EXPLAIN ANALYZE获取信息">用EXPLAIN ANALYZE获取信息一个>,以获取更多资讯。
查询强制类型注入。在8.0.18及以后的版本中,MySQL在参数的数据类型与期望的数据类型不匹配的表达式和条件中向查询项树注入强制转换操作。这对查询结果或执行速度没有影响,但使执行的查询等同于符合SQL标准的查询,同时保持与以前版本的MySQL的向后兼容性。
这种隐式强制类型转换现在在时态类型(<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">日期
,<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">DATETIME
,<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">时间戳
,<一个class="link" href="//www.delbede.com/doc/refman/en/time.html" title="">时间
)和数字类型(<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">短整型
,<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">非常小的整数
,<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">MEDIUMINT
,<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">INT
/<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">整数
,<一个class="link" href="//www.delbede.com/doc/refman/en/integer-types.html" title="">长整型数字
;<一个class="link" href="//www.delbede.com/doc/refman/en/fixed-point-types.html" title="">小数
/<一个class="link" href="//www.delbede.com/doc/refman/en/fixed-point-types.html" title="">数字
;<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">浮动
,<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">双
,<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">真正的
;<一个class="link" href="//www.delbede.com/doc/refman/en/bit-type.html" title="">位
),只要使用任何标准数值比较运算符(<一个class="link" href="//www.delbede.com/doc/refman/en/assignment-operators.html">=
,<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html">>=
,<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html">>
,<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html"><
,<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html">< =
,<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html"><>
/<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html">! =
,或<一个class="link" href="//www.delbede.com/doc/refman/en/comparison-operators.html">< = >
).在这种情况下,任何不是a的值双
是一个角色。现在也可以执行强制类型注入来比较<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">日期
或<一个class="link" href="//www.delbede.com/doc/refman/en/time.html" title="">时间
价值观和<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">DATETIME
值,其中参数在必要时被强制转换为DATETIME
.
从MySQL 8.0.21开始,在比较字符串类型和其他类型时也会执行这样的强制转换。强制转换的字符串类型包括<一个class="link" href="//www.delbede.com/doc/refman/en/char.html" title="">字符
,<一个class="link" href="//www.delbede.com/doc/refman/en/char.html" title="">VARCHAR
,<一个class="link" href="//www.delbede.com/doc/refman/en/binary-varbinary.html" title="">二进制
,<一个class="link" href="//www.delbede.com/doc/refman/en/binary-varbinary.html" title="">VARBINARY
,<一个class="link" href="//www.delbede.com/doc/refman/en/blob.html" title="">团
,<一个class="link" href="//www.delbede.com/doc/refman/en/blob.html" title="">文本
,<一个class="link" href="//www.delbede.com/doc/refman/en/enum.html" title="">枚举
,<一个class="link" href="//www.delbede.com/doc/refman/en/set.html" title="">集
.比较字符串类型的值与数字类型或一年
,字符串强制转换为双
;如果另一个参数的类型不是浮动
,双
,或真正的
,它也是铸造的双
.比较字符串类型和DATETIME
或时间戳
值时,将字符串强制转换为DATETIME
;比较字符串类型与日期
,将字符串强制转换为日期
.
的输出可以查看何时将强制类型转换注入给定查询<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释分析
,解释格式= JSON
,或者,如图所示,解释格式=树
:
创建表d (dt DATETIME, d DATE, t TIME);mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);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'));查询OK, 0行受影响(0.50秒)mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G ***************************行 *************************** 解释:- >内部散列连接((d。Dt as double) = cast(n。I为double))(cost=0.70 rows=1) -> Hash ->在d上扫描表(cost=0.35 rows=1) mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d on d.t t= s.c\G *************************** 1。行 *************************** 解释:- >内部散列连接(d.t t = cast(s.c as datetime(6)))(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 ***************************行 *************************** 解释:- >内部散列连接((n。D as double) = cast(cas double))(cost=0.35 rows=1) -> Hash ->在n (cost=0.35 rows=1)上扫描表(cost=0.35 rows=1)
也可以通过执行解释(传统格式=)
,在这种情况下,也有必要发行<一个class="link" href="//www.delbede.com/doc/refman/en/show-warnings.html" title="">显示警告
在执行解释
声明。
对TIMESTAMP和DATETIME的时区支持。从MySQL 8.0.19开始,服务器接受带有插入datetime()的时区偏移量。<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">时间戳
和<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">DATETIME
)的值。此偏移量使用与设置时相同的格式<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">time_zone
系统变量,但当偏移量的小时部分小于10时需要一个前导零,并且“0”
是不允许的。包含时区偏移量的日期时间文字的示例如下“2019-12-11 10:40:30-05:00”
,“2003-04-14 03:30:00 + 10点'
,“2020-01-01 15:35:45 + 05:30 '
.
选择日期时间值时不显示时区偏移量。
包含时区偏移量的日期时间文字可以用作准备好的语句参数值。
作为此工作的一部分,用于设置<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">time_zone
系统变量现在也限定在这个范围内13:59
来+夏令时间
、包容。(仍然可以将名称值分配给time_zone
如EST
,Posix /澳大利亚/布里斯班的
,“欧洲/斯德哥尔摩”
这个变量,前提是MySQL时区表被加载;看到<一个class="xref" href="//www.delbede.com/doc/refman/en/time-zone-support.html" title="填充时区表">填充时区表一个>).
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/time-zone-support.html" title="第5.1.15节,“MySQL服务器时区支持”">第5.1.15节,“MySQL服务器时区支持”一个>,以及……<一个class="xref" href="//www.delbede.com/doc/refman/en/datetime.html" title="第11.2.2节,DATE, DATETIME和TIMESTAMP类型">第11.2.2节,DATE, DATETIME和TIMESTAMP类型一个>.
JSON模式CHECK约束失败的精确信息。当使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-validation-functions.html">JSON_SCHEMA_VALID ()
指定检查
MySQL 8.0.19及以后版本提供了关于此类约束失败原因的精确信息。
有关示例和更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-validation-functions.html" title="JSON_SCHEMA_VALID()和CHECK约束">JSON_SCHEMA_VALID()和CHECK约束一个>.另请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/create-table-check-constraints.html" title="第13.1.20.6节,“检查约束”">第13.1.20.6节,“检查约束”一个>.
行和列别名与ON DUPLICATE KEY UPDATE。从MySQL 8.0.19开始,可以使用别名引用要插入的行和列。考虑以下几点<一个class="link" href="//www.delbede.com/doc/refman/en/insert.html" title="">插入
表上的语句t
在列一个
和b
:
INSERT INTO SET a=9,b=5; UPDATE a=VALUES(a)+VALUES(b);
使用别名新
对于新行,在某些情况下,对于别名米
和n
对于这一行的列插入
语句可以用许多不同的方式重写,下面展示了一些例子:
INSERT INTO SET a=9,b=5 AS new ON DUPLICATE KEYINSERT INTO VALUES(9,5) AS new ON DUPLICATE KEY UPDATE a=new.a+new.b;INSERT INTO SET a=9,b=5 AS new(m,n) ON DUPLICATE KEYINSERT INTO t VALUES(9,5) AS new(m,n) ON DUPLICATE KEY
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/insert-on-duplicate.html" title="第13.2.6.2节,“插入…重复键更新语句"">第13.2.6.2节,“插入…重复键更新语句"一个>.
SQL标准显式表子句和表值构造函数。根据SQL标准增加了表值构造函数和显式表子句。它们分别在MySQL 8.0.19中实现,作为<一个class="link" href="//www.delbede.com/doc/refman/en/table.html" title="">表格
声明及<一个class="link" href="//www.delbede.com/doc/refman/en/values.html" title="">值
声明。
的<一个class="link" href="//www.delbede.com/doc/refman/en/table.html" title="">表格
语句的格式为表格
,并等价于table_name
Select * from
.它支持table_name
命令
和限制
子句(后者带有可选)抵消
),但不允许选择单个表列。表格
可以用在任何地方,你会使用等效的<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
声明;这包括连接,联合,<一个class="link" href="//www.delbede.com/doc/refman/en/insert-select.html" title="">插入……选择
,<一个class="link" href="//www.delbede.com/doc/refman/en/replace.html" title="">取代
,<一个class="link" href="//www.delbede.com/doc/refman/en/create-table-select.html" title="">创建表…选择
语句和子查询。例如:
表1 UNION
等于SELECT * FROM t1 and SELECT * FROM t2
创建表t2
等于SELECT * FROM t1
SELECT a FROM t1 WHERE b > ANY(表t2)
等于SELECT * FROM t2
.
值
可用于向<一个class="link" href="//www.delbede.com/doc/refman/en/insert.html" title="">插入
,<一个class="link" href="//www.delbede.com/doc/refman/en/replace.html" title="">取代
,或<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
语句,由值
关键字后面跟着一系列行构造函数(行()
),以逗号分隔。例如,语句INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9)
提供了一个sql兼容的等价于mysql特定的INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9)
.您也可以从<一个class="link" href="//www.delbede.com/doc/refman/en/values.html" title="">值
表值构造函数,就像处理表一样,但要记住,这样做时必须提供表别名,并使用它<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
就像你对其他人一样;这包括连接、联合和子查询。
欲了解更多有关表格
和值
,有关它们的使用示例,请参阅本文档的以下部分:10bet官方网站
优化器提示强制索引,忽略索引。米ySQL 8.0引入了索引级优化器提示,类似于中描述的传统索引提示<一个class="xref" href="//www.delbede.com/doc/refman/en/index-hints.html" title="第8.9.4节“索引提示”">第8.9.4节“索引提示”一个>.这里列出了新的提示,以及它们的提示力指数
或忽略指数
同类产品:
GROUP_INDEX
:相当于组的力指数
NO_GROUP_INDEX
:相当于忽略group by的索引
JOIN_INDEX
:相当于连接力指数
NO_JOIN_INDEX
:相当于忽略连接的索引
ORDER_INDEX
:相当于顺序的力指数
NO_ORDER_INDEX
:相当于忽略排序索引
指数
和…一样<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">GROUP_INDEX
+<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">JOIN_INDEX
+<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">ORDER_INDEX
;相当于力指数
没有修饰语
NO_INDEX
和…一样<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_GROUP_INDEX
+<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_JOIN_INDEX
+<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_ORDER_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中删除。它们没有实现一个完全等价的使用索引
;相反,您可以使用一个或多个<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_INDEX
,<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_JOIN_INDEX
,<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_GROUP_INDEX
,或<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_ORDER_INDEX
达到同样的效果。
有关更多信息和使用示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="索引级优化器提示">索引级优化器提示一个>.
JSON_VALUE()函数。米ySQL 8.0.21实现了一个新功能<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_VALUE ()
旨在简化索引<一个class="link" href="//www.delbede.com/doc/refman/en/json.html" title="">JSON
列。在其最基本的形式中,它接受一个JSON文档和一个指向该文档中单个值的JSON路径作为参数,以及(可选地)允许您使用返回
关键字。JSON_VALUE (
等价于:json_doc
,路径
返回类型
)
Cast (json_unquote) (json_extract (json_doc,路径))作为类型);
你也可以指定在空
,在错误
,或两个分句,类似于with的从句<一个class="link" href="//www.delbede.com/doc/refman/en/json-table-functions.html">JSON_TABLE ()
.
你可以用JSON_VALUE ()
在表达式上创建索引JSON
像这样的专栏:
CREATE TABLE t1(JSON_VALUE(JSON_VALUE(j, '$. JSON '))id' return UNSIGNED))));插入t1值行(' {" id ": " 123 ", "名称":“鞋”,“价格”:“49.95”}”);
使用这个表达式的查询,如下面所示,可以使用索引:
SELECT name, price FROM t1 WHERE JSON_VALUE(j, '$。id' return UNSIGNED) = 123;
控件创建生成的列在许多情况下要简单得多JSON
列,然后在生成的列上创建索引。
有关更多信息和示例,请参见的描述<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_VALUE ()
.
用户评论和用户属性。米ySQL 8.0.21引入了在创建或更新用户帐户时设置用户评论和用户属性的功能。用户注释由作为参数传递给的任意文本组成评论
与a连用的从句<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">创建用户
或<一个class="link" href="//www.delbede.com/doc/refman/en/alter-user.html" title="">改变用户
声明。用户属性由JSON对象形式的数据组成,该对象作为参数传递给属性
从句,用于这两个语句中的任何一个。该属性可以包含JSON对象表示法中任何有效的键值对。只有一个评论
或属性
可以单独使用吗创建用户
或改变用户
声明。
用户评论和用户属性在内部作为JSON对象存储在一起,评论文本作为元素的值评论
作为它的关键。此信息可以从属性
列<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-user-attributes-table.html" title="">INFORMATION_SCHEMA。USER_ATTRIBUTES
表;因为它是JSON格式,你可以使用MySQL的JSON函数和操作符来解析它的内容(参见<一个class="xref" href="//www.delbede.com/doc/refman/en/json-functions.html" title="第12.18节,“JSON函数”">第12.18节,“JSON函数”一个>).对象时,对用户属性的连续更改将与其当前值合并<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE_PATCH ()
函数。
例子:
mysql>创建用户'mary'@'localhost'注释'这是mary Smith的帐户';mysql> ALTER USER 'mary'@'localhost' -比> ATTRIBUTE '{"fname":" mary ", "lname":"Smith"}';查询OK, 0行受影响(0.14秒)mysql> ALTER USER 'mary'@'localhost' -比' ATTRIBUTE '{"email":"mary.smith@example.com"}';查询OK, 0行受影响(0.12秒)mysql> SELECT -> USER, -> HOST, -> ATTRIBUTE->>"$。$. fname" AS '名字',-> ATTRIBUTE->>"。$. lname" AS '姓',-> ATTRIBUTE->>"。$. Comment " AS ' email ', -> ATTRIBUTE->>"$. Comment " AS 'Comment' -> FROM INFORMATION_SCHEMA。USER_ATTRIBUTES->在哪里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)
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/create-user.html" title="第13.7.1.3节," CREATE USER语句"">第13.7.1.3节," CREATE USER语句"一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/alter-user.html" title="第13.7.1.1节“ALTER USER语句”">第13.7.1.1节“ALTER USER语句”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/information-schema-user-attributes-table.html" title="第26.3.46节," INFORMATION_SCHEMA USER_ATTRIBUTES表"">第26.3.46节," INFORMATION_SCHEMA USER_ATTRIBUTES表"一个>.
新的optimizer_switch标志。米ySQL 8.0.21添加了两个新的标志<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">optimizer_switch
系统变量,如下表所示:
默认情况下,MySQL尝试为any使用有序索引命令
或集团
具有限制
子句,每当优化器确定这将导致更快的执行时。因为在某些情况下,为此类查询选择不同的优化实际上可能会执行得更好,所以现在可以通过设置<一个class="link" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html">prefer_ordering_index
旗帜从
.
该标志的默认值为在
.
当此标志设置为在
,优化器将符合条件的标量子查询转换为派生表上的连接。例如,查询SELECT * FROM t1 WHERE t1。一个>(选择COUNT(a) FROM t2)
被改写为选择t1。一个从t1加入(选择COUNT(t2.a) AS c FROM t2 ) AS d WHERE t1.a > d.c
.
此优化可以应用于子查询,该子查询是a的一部分选择
,在哪里
,加入
,或有
条款;包含一个或多个聚合函数,但没有集团
条款;不相关;不使用任何不确定函数。
该优化还可以应用于作为参数的表子查询在
,不是在
,存在
,或不存在
,其中不包含集团
.例如,查询SELECT * FROM t1 WHERE t1。b < 0或t1。一个(选择t2.a + 1 FROM t2)
被改写为左连接(SELECT DISTINCT 1 AS e1, t2)a AS e2 FROM t2) d ON t1。a + 1 = d.e2 WHERE t1。b<0或d.e1 IS NOT NULL
.
从MySQL 8.0.24开始,这种优化也可以应用于相关标量子查询,方法是对其应用额外的分组,然后在提升的谓词上应用外部连接。例如,查询如下SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a
可以重写为选择t1。* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a)A =导出。一个在哪里derived.a > 0
.MySQL执行基数检查以确保子查询不会返回多于一行(<一个class="ulink" href="//www.delbede.com/doc/mysql-errors/8.0/en/server-error-reference.html" target="_top">ER_SUBQUERY_NO_1_ROW
).看到<一个class="xref" href="//www.delbede.com/doc/refman/en/correlated-subqueries.html" title="第13.2.11.7节“相关子查询”">第13.2.11.7节“相关子查询”一个>,以获取更多资讯。
这种优化通常是禁用的,因为它在大多数情况下不会产生明显的性能优势;旗子设置为从
默认情况下。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html" title="第8.9.2节“可切换的优化”">第8.9.2节“可切换的优化”一个>.另请参阅<一个class="xref" href="//www.delbede.com/doc/refman/en/limit-optimization.html" title="第8.2.1.19节,“限制查询优化”">第8.2.1.19节,“限制查询优化”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/semijoins.html" title="第8.2.2.1节“使用半连接转换优化IN和EXISTS子查询谓词”">第8.2.2.1节“使用半连接转换优化IN和EXISTS子查询谓词”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/derived-table-optimization.html" title="第8.2.2.4节,“使用合并或物化优化派生表、视图引用和常用表表达式”">第8.2.2.4节,“使用合并或物化优化派生表、视图引用和常用表表达式”一个>.
XML的增强。从MySQL 8.0.21开始,<一个class="link" href="//www.delbede.com/doc/refman/en/load-xml.html" title="">加载XML
语句现在支持CDATA
部分中要导入的XML。
现在支持转换为YEAR类型。从MySQL 8.0.22开始,服务器允许强制转换<一个class="link" href="//www.delbede.com/doc/refman/en/year.html" title="">一年
.这两个<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">把()
和<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">将()
函数支持个位数、两位和四位一年
值。对于一位数和两位数的值,允许的范围是0-99。四位数字取值范围为1901 ~ 2155。一年
的返回类型也可以使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-search-functions.html">JSON_VALUE ()
函数;此函数只支持4位年份。
字符串、时间和日期以及浮点值都可以强制转换为一年
.铸造的<一个class="link" href="//www.delbede.com/doc/refman/en/spatial-type-overview.html" title="">几何
值一年
不支持。
控件的详细信息(包括转换规则),请参见<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">将()
函数。
检索时间戳值为UTC。米ySQL 8.0.22及以后版本支持a<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">时间戳
从系统时区到UTC的列值<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">DATETIME
关于检索,使用演员(
,其中指定符是其中之一价值
在时区说明符
DATETIME)(间隔)+ 0的
或UTC的
.的精度DATETIME
如果需要,可以将强制转换返回的值指定为小数点后6位。的数组
关键字在此构造中不受支持。
时间戳
还支持使用时区偏移量插入表中的值。使用在时区
不支持<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">将()
或任何其他MySQL函数或结构。
的描述,以获取更多信息和示例<一个class="link" href="//www.delbede.com/doc/refman/en/cast-functions.html">把()
函数。
转储文件输出同步。米ySQL 8.0.22及以后版本在写入文件时支持周期性同步<一个class="link" href="//www.delbede.com/doc/refman/en/select-into.html" title="">选择进入转储文件
和选择输出文件
语句。可以通过设置<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">select_into_disk_sync
系统变量to在
;写缓冲区的大小由设置的值决定<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">select_into_buffer_size
;默认值是131072 (2)17)字节。
此外,可以使用。设置同步到磁盘后的可选延迟<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">select_into_disk_sync_delay
;缺省值为无延迟(0毫秒)。
有关详细信息,请参阅本项前面引用的变量的描述。
单次编制报表。从MySQL 8.0.22开始,准备好的语句只准备一次,而不是每次执行一次。这是在执行时完成的<一个class="link" href="//www.delbede.com/doc/refman/en/prepare.html" title="">准备
.对于存储过程中的任何语句也是如此;语句在存储过程第一次执行时准备一次。
这种变化的一个结果是,解析预处理语句中使用的动态参数的方式也按照下面列出的方式发生了变化:
准备好的语句参数在准备语句时被赋予数据类型;该类型在语句的每次后续执行中持续存在(除非重新准备语句;见后)。
在已准备语句中对给定参数或用户变量使用不同的数据类型,以便在第一次执行之后执行该语句,可能导致该语句被重新准备;因此,在重新执行预处理语句时,建议对给定参数使用相同的数据类型。
为了与SQL标准保持一致,下列使用窗口函数的结构将不再被接受:
铅(
和<一个class="link" href="//www.delbede.com/doc/refman/en/window-function-descriptions.html">expr
,神经网络
)滞后(
,在那里expr
,神经网络
)神经网络
是一个负数
这有助于更好地遵从SQL标准。有关详细信息,请参阅各个函数的描述。
在准备好的语句中引用的用户变量现在具有在语句准备时确定的数据类型;该类型在语句的每次后续执行中持续存在。
存储过程中语句引用的用户变量现在在语句第一次执行时确定其数据类型;对于包含存储过程的任何后续调用,该类型都将持续存在。
在执行形式的预处理语句时选择
,传递整数值expr1
,expr2
,……从表格
点餐?N
的方法对结果进行排序N
th表达式在选择列表中;结果不再是有序的,正如预期的那样命令
.常数
将语句用作准备语句或在存储过程中只准备一次,可以提高语句的性能,因为它消除了重复准备所增加的成本。这样做还可以避免可能的多次回滚准备结构,这是MySQL中许多问题的根源。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/prepare.html" title="第13.5.1节“PREPARE语句”">第13.5.1节“PREPARE语句”一个>.
右连接作为左连接处理。从MySQL 8.0.22开始,服务器处理所有的实例正确的连接
在内部,左连接
消除了在解析时未执行完整转换的许多特殊情况。
导出条件下推优化。米ySQL 8.0.22(及更高版本)实现了派生条件下推查询具有物化派生表。对于查询,例如SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i >
在美国,现在在许多情况下可以推到外面常数
在哪里
条件下移到派生表,在本例中导致SELECT * FROM (SELECT i, j FROM t1 WHERE i >
.常数
) t
以前,如果派生表被物化而没有合并,MySQL将物化整个表,然后使用在哪里
条件。移动在哪里
使用派生条件下推优化将条件放入子查询中,通常可以减少必须处理的行数,从而减少执行查询所需的时间。
一个外在哪里
当派生表不使用任何聚合函数或窗口函数时,条件可以直接下推到物化的派生表。当派生表具有集团
并且不使用任何窗口函数,外部在哪里
条件可以下推到派生表中有
条件。的在哪里
条件也可以下推,当派生表使用窗口函数和外部在哪里
中使用的列分区
条款。
属性所指示的,默认情况下启用派生条件下推<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">optimizer_switch
系统变量的<一个class="link" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html">derived_condition_pushdown
国旗。在MySQL 8.0.22中添加的标志被设置为在
默认情况下;要禁用特定查询的优化,可以使用<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">NO_DERIVED_CONDITION_PUSHDOWN
优化器提示(也在MySQL 8.0.22中添加)。如果由于以下原因禁用了优化<一个class="link" href="//www.delbede.com/doc/refman/en/switchable-optimizations.html">derived_condition_pushdown
被设置为从
,可以为给定的查询启用它<一个class="link" href="//www.delbede.com/doc/refman/en/optimizer-hints.html" title="">DERIVED_CONDITION_PUSHDOWN
.
的派生表不能使用派生条件下推优化<一个class="link" href="//www.delbede.com/doc/refman/en/union.html" title="">联盟
或限制
条款。此外,不能将本身使用子查询的条件下推在哪里
条件不能下推到派生表,派生表也是外部连接的内部表。有关其他信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/derived-condition-pushdown-optimization.html" title="第8.2.2.5节,“派生条件下推优化”">第8.2.2.5节,“派生条件下推优化”一个>.
对MySQL授权表进行非锁定读取。从MySQL 8.0.22开始,为了允许在MySQL授权表上并发进行DML和DDL操作,之前在MySQL授权表上获得行锁的读操作将作为非锁定读操作执行。
现在在MySQL授权表上以非锁读的方式执行的操作包括:
选择
语句和其他通过连接列表和子查询从授权表读取数据的只读语句,包括<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-locking-reads.html" title="">选择……为分享
语句,使用任何事务隔离级别。
使用任何事务隔离级别从授权表(通过连接列表或子查询)读取数据但不修改数据的DML操作。
有关其他信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/grant-tables.html" title="授予表并发性">授予表并发性一个>.
以下特性在MySQL 8.0中已弃用,可能会在将来的系列中删除。在显示替代方案的地方,应该更新应用程序以使用它们。
如果应用程序使用了在MySQL 8.0中弃用的特性,而这些特性在更高的MySQL系列中已经被删除,那么在从MySQL 8.0源复制到更高的MySQL系列副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免此类问题,应该修改使用8.0中弃用的特性的应用程序,以避免使用这些特性,并在可能的情况下使用替代方案。
的utf8mb3
字符集已弃用。请使用utf8mb4
代替。
因为caching_sha2_password
是MySQL 8.0中的默认身份验证插件,它提供了sha256_password
身份验证插件,sha256_password
弃用;预计它将在MySQL的未来版本中被删除。MySQL帐户认证使用sha256_password
应该迁移使用吗caching_sha2_password
代替。
的validate_password
插件已被重新实现以使用组件基础结构。的插件形式validate_password
仍然可用,但现在已弃用;预计它将在MySQL的未来版本中被删除。使用插件的MySQL安装应该转换为使用组件。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/validate-password-transitioning.html" title="第6.4.3.3节,“过渡到密码验证组件”">第6.4.3.3节,“过渡到密码验证组件”一个>.
的引擎
条款<一个class="link" href="//www.delbede.com/doc/refman/en/alter-tablespace.html" title="">修改表空间
和<一个class="link" href="//www.delbede.com/doc/refman/en/drop-tablespace.html" title="">删除表空间
语句已弃用。
的<一个class="link" href="//www.delbede.com/doc/refman/en/sql-mode.html">PAD_CHAR_TO_FULL_LENGTH
SQL模式已弃用。
AUTO_INCREMENT
类型的列不支持<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">浮动
和<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">双
(以及任何同义词)。考虑移除AUTO_INCREMENT
属性,或将其转换为整数类型。
的无符号
类型的列不赞成使用属性<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">浮动
,<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">双
,<一个class="link" href="//www.delbede.com/doc/refman/en/fixed-point-types.html" title="">小数
(以及任何同义词)。考虑使用简单的检查
约束替换为这样的列。
浮动(
和米
,D
)双(
类型的列指定位数的语法<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">米
,D
)浮动
和<一个class="link" href="//www.delbede.com/doc/refman/en/floating-point-types.html" title="">双
是一个非标准的MySQL扩展。此语法已弃用。
的补零
属性对于数字数据类型不赞成使用,对于整数数据类型也不赞成使用display width属性。考虑使用另一种方法来产生这些属性的效果。例如,应用程序可以使用<一个class="link" href="//www.delbede.com/doc/refman/en/string-functions.html">LPAD ()
函数将数字零填充到所需的宽度,或者它们可以将格式化的数字存储在<一个class="link" href="//www.delbede.com/doc/refman/en/char.html" title="">字符
列。
对于字符串数据类型,二进制
属性是一个非标准的MySQL扩展,它是指定二进制(_bin
)列字符集的排序(如果未指定列字符集,则为表默认字符集的排序)。在MySQL 8.0中,这种非标准的用法二进制
是模糊的,因为utf8mb4
字符集有多个_bin
排序,所以二进制
属性已弃用;期望在MySQL的未来版本中删除对它的支持。应用程序应该调整为使用显式的_bin
排序。
的使用二进制
指定的数据类型或字符集保持不变。
非标准的c样式<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">& &
,<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">||
,<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">!
操作符是标准SQL的同义词<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">和
,<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">或
,<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">不
不建议分别使用操作符。应该调整使用非标准操作符的应用程序以使用标准操作符。
使用<一个class="link" href="//www.delbede.com/doc/refman/en/logical-operators.html">||
被弃用,除非<一个class="link" href="//www.delbede.com/doc/refman/en/sql-mode.html">PIPES_AS_CONCAT
已启用SQL模式。在这种情况下,||
表示sql标准的字符串连接操作符)。
的<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE ()
函数已弃用。使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_MERGE_PRESERVE ()
代替。
的SQL_CALC_FOUND_ROWS
查询修饰符及其伴随<一个class="link" href="//www.delbede.com/doc/refman/en/information-functions.html">FOUND_ROWS ()
函数已弃用。看到<一个class="link" href="//www.delbede.com/doc/refman/en/information-functions.html">FOUND_ROWS ()
替代策略信息的描述。
支持TABLESPACE = innodb_file_per_table
和TABLESPACE = innodb_temporary
条款与<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建临时表
自MySQL 8.0.13起已弃用。
为<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
语句,使用an成
条款后从
但不是在最后<一个class="link" href="//www.delbede.com/doc/refman/en/select.html" title="">选择
自MySQL 8.0.20起已弃用。最好是放置成
在语句的末尾。
为<一个class="link" href="//www.delbede.com/doc/refman/en/union.html" title="">联盟
语句中,这两个变量包含成
自MySQL 8.0.20起已弃用:
在查询表达式的尾部查询块中,使用成
之前从
.
在查询表达式末尾带括号的块中,使用成
,而不考虑其相对位置从
.
看到<一个class="xref" href="//www.delbede.com/doc/refman/en/select-into.html" title="第13.2.10.1节,“SELECT…声明”">第13.2.10.1节,“SELECT…声明”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/union.html" title="第13.2.10.3节“UNION条款”">第13.2.10.3节“UNION条款”一个>.
冲洗主机
自MySQL 8.0.23起已弃用。相反,截断Performance Schema<一个class="link" href="//www.delbede.com/doc/refman/en/performance-schema-host-cache-table.html" title="">host_cache
表:
TRUNCATE表performance_schema.host_cache
的<一个class="link" href="//www.delbede.com/doc/refman/en/truncate-table.html" title="">截断表
操作需要<一个class="link" href="//www.delbede.com/doc/refman/en/privileges-provided.html">下降
这张桌子的特权。
的<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-upgrade.html" title="">mysql_upgrade类中的系统表的升级功能已被弃用mysql
系统模式和其他模式中的对象已移动到MySQL服务器中。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/upgrading-what-is-upgraded.html" title="第2.11.3节“MySQL升级过程升级了什么”">第2.11.3节“MySQL升级过程升级了什么”一个>.
的<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——no-dd-upgrade
服务器选项已弃用。它被<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——升级
选项,它提供了对数据字典和服务器升级行为的更精细的控制。
的mysql_upgrade_info
文件,创建的数据目录,用于存储MySQL的版本号,是不赞成的;预计它将在MySQL的未来版本中被删除。
的relay_log_info_file
系统变量和——master-info-file
选项已弃用。在此之前,它们用于指定中继日志信息日志和源信息日志的名称<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-replica.html">relay_log_info_repository =文件
和<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-replica.html">master_info_repository =文件
设置,但这些设置已被弃用。中继日志信息日志和源信息日志的文件使用已被崩溃安全复制表取代,这是MySQL 8.0中的默认设置。
的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">max_length_for_sort_data
系统变量现在已被弃用,因为优化器的更改使其过时且不起作用。
这些用于压缩到服务器的连接的遗留参数已弃用<一个class="link" href="//www.delbede.com/doc/refman/en/connection-options.html">——压缩
客户端命令行选项;的MYSQL_OPT_COMPRESS
的选项<一个class="ulink" href="//www.delbede.com/doc/c-api/8.0/en/mysql-options.html" target="_top">mysql_options ()
C API函数;的<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-replica.html">slave_compressed_protocol
系统变量。有关要使用的参数的信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/connection-compression-control.html" title="第4.2.8节,“连接压缩控制”">第4.2.8节,“连接压缩控制”一个>.
的使用MYSQL_PWD
不建议使用环境变量来指定MySQL密码。
使用<一个class="link" href="//www.delbede.com/doc/refman/en/miscellaneous-functions.html">值()
中的新行值<一个class="link" href="//www.delbede.com/doc/refman/en/insert-on-duplicate.html" title="">插入……重复键更新
自MySQL 8.0.20起已弃用。请为新行和新列使用别名。
因为指定在错误
之前在空
当调用<一个class="link" href="//www.delbede.com/doc/refman/en/json-table-functions.html">JSON_TABLE ()
是与SQL标准相违背的,这种语法现在已经在MySQL中弃用了。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印一个警告。指定这两个子句时JSON_TABLE ()
调用,确保在空
首先使用。
带有索引前缀的列从未被支持作为表分区键的一部分;以前,在创建、修改或升级分区表时允许这样做,但是表的分区函数不允许这样做,并且服务器不会发出警告。这种允许的行为现在已被弃用,并且在MySQL的未来版本中可能会被删除,因为在分区键中使用任何这样的列都会导致错误<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建表
或<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">ALTER TABLE
他们的陈述被拒绝了。
从MySQL 8.0.21开始,只要使用索引前缀的列被指定为分区键的一部分,就会为每个这样的列生成一个警告。每当一个<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建表
或<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">ALTER TABLE
语句被拒绝,因为建议的分区键中的所有列都有索引前缀,所产生的错误现在提供了拒绝的确切原因。在这两种情况下,分区函数中使用的列都被隐式地定义为表主键中的列按键分区()
条款。
有关更多信息和示例,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/partitioning-limitations.html" title="键分区不支持列索引前缀">键分区不支持列索引前缀一个>.
InnoDB memcached插件从MySQL 8.0.22起已弃用;期望在MySQL的未来版本中删除对它的支持。
的<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">temptable_use_mmap
变量从MySQL 8.0.26开始已弃用;期望在MySQL的未来版本中删除对它的支持。
以下项在MySQL 8.0中已经过时并被删除。在显示替代方案的地方,应该更新应用程序以使用它们。
对于使用MySQL 8.0中删除的特性的MySQL 5.7应用程序,在从MySQL 5.7源复制到MySQL 8.0副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为了避免这些问题,使用MySQL 8.0中删除的特性的应用程序应该进行修改,以避免它们,并在可能的情况下使用替代方案。
的innodb_locks_unsafe_for_binlog
系统变量被删除。的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-transaction-isolation-levels.html">读过承诺
隔离级别提供类似的功能。
的information_schema_stats
变量,在MySQL 8.0.0中引入,被删除并替换为<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">information_schema_stats_expiry
在MySQL 8.0.3中
information_schema_stats_expiry
定义缓存的过期设置<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema.html" title="">INFORMATION_SCHEMA
表统计数据。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/information-schema-optimization.html" title="第8.2.3节“优化INFORMATION_SCHEMA查询”">第8.2.3节“优化INFORMATION_SCHEMA查询”一个>.
与过时相关的代码InnoDB
在MySQL 8.0.3中删除了系统表。<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema.html" title="">INFORMATION_SCHEMA
基于的视图InnoDB
系统表被数据字典表上的内部系统视图所取代。影响InnoDB
INFORMATION_SCHEMA
视图被重命名为:
表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或更高版本后,请更新引用以前版本的任何脚本InnoDB
INFORMATION_SCHEMA
视图名称。
删除了以下与帐户管理相关的功能:
使用<一个class="link" href="//www.delbede.com/doc/refman/en/grant.html" title="">格兰特
创建用户。相反,使用<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">创建用户
.遵循这一做法使NO_AUTO_CREATE_USER
SQL模式无关紧要<一个class="link" href="//www.delbede.com/doc/refman/en/grant.html" title="">格兰特
语句中,因此它也被删除,并且当为的存在此值时,现在将错误写入服务器日志sql_mode
选项可以防止<一个class="link" href="//www.delbede.com/doc/refman/en/mysqld.html" title="">mysqld从开始。
使用<一个class="link" href="//www.delbede.com/doc/refman/en/grant.html" title="">格兰特
修改特权分配以外的帐户属性。这包括身份验证、SSL和资源限制属性。相反,在创建帐户时使用<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">创建用户
或者之后用<一个class="link" href="//www.delbede.com/doc/refman/en/alter-user.html" title="">改变用户
.
用密码识别
语法<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">auth_string
'创建用户
和<一个class="link" href="//www.delbede.com/doc/refman/en/grant.html" title="">格兰特
.相反,使用认同
为<一个class="link" href="//www.delbede.com/doc/refman/en/create-user.html" title="">auth_plugin
为“auth_string
'创建用户
和<一个class="link" href="//www.delbede.com/doc/refman/en/alter-user.html" title="">改变用户
,其中'
值的格式与指定插件兼容。auth_string
'
此外,由于用密码识别
语法被删除了log_builtin_as_identified_by_password
系统变量是多余的,已被删除。
的密码()
函数。此外,密码()
移除意味着<一个class="link" href="//www.delbede.com/doc/refman/en/set-password.html" title="">设置密码…=密码(“
语法不再可用。auth_string
”)
的old_passwords
系统变量。
已删除查询缓存。移除的物品包括:
的刷新查询缓存
和重置查询缓存
语句。
这些系统变量:query_cache_limit
,query_cache_min_res_unit
,query_cache_size
,query_cache_type
,query_cache_wlock_invalidate
.
这些状态变量:Qcache_free_blocks
,Qcache_free_memory
,Qcache_hits
,Qcache_inserts
,Qcache_lowmem_prunes
,Qcache_not_cached
,Qcache_queries_in_cache
,Qcache_total_blocks
.
这些线程状态:检查缓存查询的权限
,检查查询缓存是否存在查询
,正在使查询缓存项失效
,将缓存结果发送到客户端
,将结果存储在查询缓存中
,等待查询缓存锁
.
的SQL_CACHE
选择
修饰符。
这些不推荐的查询缓存项仍然不推荐,但没有效果;期望在未来的MySQL版本中删除它们:
的SQL_NO_CACHE
选择
修饰符。
的ndb_cache_check_time
系统变量。
的have_query_cache
系统变量仍然不推荐使用,并且始终具有值没有
;预计它将在未来的MySQL版本中被删除。
数据字典提供关于数据库对象的信息,因此服务器不再检查数据目录中的目录名来查找数据库。因此,——ignore-db-dir
选项,ignore_db_dirs
系统变量是无关的,并被删除。
DDL日志(也称为元数据日志)已被删除。从MySQL 8.0.3开始,这个功能由数据字典处理innodb_ddl_log
表格看到<一个class="xref" href="//www.delbede.com/doc/refman/en/atomic-ddl.html" title="查看DDL日志">查看DDL日志一个>.
的tx_isolation
和tx_read_only
已移除系统变量。使用transaction_isolation
和transaction_read_only
代替。
的sync_frm
系统变量已被删除,因为.frm
文件已经过时了。
的secure_auth
系统变量和——secure-auth
客户端选项已被删除。的MYSQL_SECURE_AUTH
的选项<一个class="ulink" href="//www.delbede.com/doc/c-api/8.0/en/mysql-options.html" target="_top">mysql_options ()
删除了C API函数。
的multi_range_count
系统变量被移除。
的log_warnings
系统变量和——log-warnings
服务器选项已被删除。使用<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">log_error_verbosity
而是系统变量。
的全局作用域<一个class="link" href="//www.delbede.com/doc/refman/en/replication-options-binary-log.html">sql_log_bin
系统变量被删除。sql_log_bin
只有会话作用域,并且依赖于访问的应用程序@@GLOBAL.sql_log_bin
应调整。
的metadata_locks_cache_size
和metadata_locks_hash_instances
删除系统变量。
未使用的date_format
,datetime_format
,time_format
,max_tmp_tables
删除系统变量。
这些已弃用的兼容性SQL模式将被删除:DB2
,MAXDB
,该软件
,MYSQL323
,MYSQL40
,甲骨文
,POSTGRESQL
,NO_FIELD_OPTIONS
,NO_KEY_OPTIONS
,NO_TABLE_OPTIONS
.他们不能再被分配到sql_mode
的允许值<一个class="link" href="//www.delbede.com/doc/refman/en/mysqldump.html" title="">, mysqldump——兼容
选择。
删除MAXDB
意思是<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">时间戳
的数据类型<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建表
或<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">ALTER TABLE
被视为<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">时间戳
,而不再被视为<一个class="link" href="//www.delbede.com/doc/refman/en/datetime.html" title="">DATETIME
.
弃用的ASC
或DESC
限定符为集团
条款被删除。以前依赖的查询集团
排序可能产生与以前MySQL版本不同的结果。要生成给定的排序顺序,请提供命令
条款。
的扩展
和分区
关键词:<一个class="link" href="//www.delbede.com/doc/refman/en/explain.html" title="">解释
声明已被删除。这些关键字是不必要的,因为它们的效果总是启用的。
这些与加密相关的项被删除:
代替删除的加密函数:For加密()
,请考虑使用<一个class="link" href="//www.delbede.com/doc/refman/en/encryption-functions.html">SHA2 ()
而不是单向哈希。对于其他选项,请考虑使用<一个class="link" href="//www.delbede.com/doc/refman/en/encryption-functions.html">AES_ENCRYPT ()
和<一个class="link" href="//www.delbede.com/doc/refman/en/encryption-functions.html">AES_DECRYPT ()
代替。
在MySQL 5.7中,为了使空间函数名称空间更加一致,在多个名称下可用的几个空间函数已被弃用,其目标是使每个空间函数名称以ST_
如果它执行一个精确的操作,或者MBR
如果它执行基于最小边界矩形的操作。在MySQL 8.0中,弃用的函数被删除,只留下相应的函数ST_
和MBR
功能:
这些函数被删除,取而代之的是MBR
的名字:包含()
,不相交的()
,Equals ()
,相交()
,重叠()
,在()
.
这些函数被删除,取而代之的是ST_
的名字:面积()
,AsBinary ()
,AsText ()
,AsWKB ()
,AsWKT ()
,缓冲()
,质心()
,ConvexHull ()
,十字架()
,尺寸()
,距离()
,端点()
,信封()
,外观()
,GeomCollFromText ()
,GeomCollFromWKB ()
,GeomFromText ()
,GeomFromWKB ()
,GeometryCollectionFromText ()
,GeometryCollectionFromWKB ()
,GeometryFromText ()
,GeometryFromWKB ()
,GeometryN ()
,GeometryType ()
,InteriorRingN ()
,关闭()
,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 ()
,曾经繁荣()
,触摸()
,X ()
,Y ()
.
GLength ()
被移去支持<一个class="link" href="//www.delbede.com/doc/refman/en/gis-linestring-property-functions.html">ST_Length ()
.
中描述的功能<一个class="xref" href="//www.delbede.com/doc/refman/en/gis-wkb-functions.html" title="第12.17.4节,从WKB值创建几何值的函数">第12.17.4节,从WKB值创建几何值的函数一个>以前接受的WKB字符串或几何参数。不再允许使用几何参数并产生错误。有关迁移查询而不使用几何参数的指导原则,请参阅该部分。
解析器不再处理\ N
作为…的同义词零
SQL语句中。使用零
代替。
执行的文本文件导入或导出操作不受此更改的影响<一个class="link" href="//www.delbede.com/doc/refman/en/load-data.html" title="">加载数据
或<一个class="link" href="//www.delbede.com/doc/refman/en/select-into.html" title="">选择……到输出文件
,为此零
继续以…为代表\ N
.看到<一个class="xref" href="//www.delbede.com/doc/refman/en/load-data.html" title="第13.2.7节“加载数据语句”">第13.2.7节“加载数据语句”一个>.
过程分析()
语法被删除。
客户端——ssl
和——ssl-verify-server-cert
选项已被删除。使用<一个class="link" href="//www.delbede.com/doc/refman/en/connection-options.html">——ssl-mode =要求
而不是——ssl = 1
或——启用ssl
.使用<一个class="link" href="//www.delbede.com/doc/refman/en/connection-options.html">——ssl-mode =禁用
而不是——ssl = 0
,——skip-ssl
,或——禁用ssl
.使用<一个class="link" href="//www.delbede.com/doc/refman/en/connection-options.html">——ssl-mode = VERIFY_IDENTITY
而不是——ssl-verify-server-cert
选项。(服务器端<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——ssl
选项仍然可用,但在MySQL 8.0.26中已弃用,并可能在未来的MySQL版本中删除。)
对于C API,MYSQL_OPT_SSL_ENFORCE
和MYSQL_OPT_SSL_VERIFY_SERVER_CERT
选项<一个class="ulink" href="//www.delbede.com/doc/c-api/8.0/en/mysql-options.html" target="_top">mysql_options ()
对应于客户端——ssl
和——ssl-verify-server-cert
选项和被删除。使用MYSQL_OPT_SSL_MODE
选项值为SSL_MODE_REQUIRED
或SSL_MODE_VERIFY_IDENTITY
代替。
的——temp-pool
服务器选项被删除。
的ignore_builtin_innodb
系统变量被移除。
服务器不再执行mysql 5.1之前包含特殊字符的数据库名称到5.1格式的转换# mysql50 #
前缀。因为不再执行这些转换,所以——fix-db-names
和——fix-table-names
选项<一个class="link" href="//www.delbede.com/doc/refman/en/mysqlcheck.html" title="">mysqlcheck,升级数据目录名称
条款<一个class="link" href="//www.delbede.com/doc/refman/en/alter-database.html" title="">修改数据库
声明,以及Com_alter_db_upgrade
状态变量被删除。
只支持从一个主要版本到另一个主要版本的升级(例如,从5.0到5.1,或从5.1到5.5),因此几乎不需要将旧的5.0数据库名称转换为当前版本的MySQL。作为解决方法,在升级到最新版本之前,请先将MySQL 5.0升级到MySQL 5.1。
的mysql_install_db程序已从MySQL发行版中删除。数据目录初始化应该通过调用来执行<一个class="link" href="//www.delbede.com/doc/refman/en/mysqld.html" title="">mysqld与<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——初始化
或<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——initialize-insecure
选项。此外,——引导
选择<一个class="link" href="//www.delbede.com/doc/refman/en/mysqld.html" title="">mysqld这是由mysql_install_db被移除,然后INSTALL_SCRIPTDIR
CMake
选项,该选项控制的安装位置mysql_install_db被删除。
从MySQL服务器中删除了通用分区处理程序。为了支持给定表的分区,表所使用的存储引擎现在必须提供自己的(”本地的”分区处理程序。的——分区
和——skip-partition
选项从MySQL服务器中删除,并且与分区相关的条目不再显示在<一个class="link" href="//www.delbede.com/doc/refman/en/show-plugins.html" title="">显示插件
或者在<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-plugins-table.html" title="">INFORMATION_SCHEMA。插件
表格
目前有两种MySQL存储引擎提供本机分区支持:<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-storage-engine.html" title="">InnoDB
和<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-cluster.html" title="">NDB
.其中,只有InnoDB
MySQL 8.0支持。在MySQL 8.0中使用任何其他存储引擎创建分区表的任何尝试都会失败。
升级的后果。使用其他存储引擎直接升级分区表InnoDB
(如<一个class="link" href="//www.delbede.com/doc/refman/en/myisam-storage-engine.html" title="">MyISAM
不支持从MySQL 5.7(或更早版本)到MySQL 8.0。处理这样的表有两种选择:
删除表的分区,使用<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table-partition-operations.html" title="">修改表…删除分区
.
将表使用的存储引擎更改为InnoDB
,<一个class="link" href="//www.delbede.com/doc/refman/en/alter-table.html" title="">修改表…引擎= INNODB
.
对于每个已分区的non-,必须至少执行上面列出的两个操作中的一个InnoDB
在服务器升级到MySQL 8.0之前,请先修改MySQL表。否则升级后将无法使用该表。
由于使用不支持分区的存储引擎创建分区表的表创建语句现在会失败,并出现错误(ER_CHECK_NOT_IMPLEMENTED),您必须确保转储文件中的任何语句(例如由<一个class="link" href="//www.delbede.com/doc/refman/en/mysqldump.html" title="">, mysqldump),如果您希望将旧版本的MySQL导入到创建分区表的MySQL 8.0服务器中,则不需要指定存储引擎,例如MyISAM
它没有本机分区处理程序。您可以通过执行以下任意一种方式来完成此操作:
删除对分区的任何引用创建表
类的值的语句存储引擎
其他选择InnoDB
.
指定存储引擎为InnoDB
,或允许InnoDB
默认情况下用作表的存储引擎。
有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/partitioning-limitations-storage-engines.html" title="第24.6.2节,与存储引擎相关的分区限制">第24.6.2节,与存储引擎相关的分区限制一个>.
系统和状态变量信息不再保存在INFORMATION_SCHEMA
.这些表格被删除:GLOBAL_VARIABLES
,SESSION_VARIABLES
,GLOBAL_STATUS
,SESSION_STATUS
.请使用相应的Performance Schema表。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/performance-schema-system-variable-tables.html" title="第27.12.14节,“性能模式系统变量表”">第27.12.14节,“性能模式系统变量表”一个>,<一个class="xref" href="//www.delbede.com/doc/refman/en/performance-schema-status-variable-tables.html" title="第27.12.15节,“性能模式状态变量表”">第27.12.15节,“性能模式状态变量表”一个>.此外,show_compatibility_56
系统变量被删除。它被用于过渡期间的系统和状态变量信息中INFORMATION_SCHEMA
表被移动到性能模式表中,不再需要。这些状态变量被删除:Slave_heartbeat_period
,Slave_last_heartbeat
,Slave_received_heartbeats
,Slave_retried_transactions
,Slave_running
.它们提供的信息可以在性能模式表中找到;看到<一个class="ulink" href="//www.delbede.com/doc/refman/5.7/en/performance-schema-variable-table-migration.html" target="_top">迁移到性能模式系统和状态变量表一个>.
性能模式setup_timer
桌子被搬走了,桌子也搬走了蜱虫
划进<一个class="link" href="//www.delbede.com/doc/refman/en/performance-schema-performance-timers-table.html" title="">performance_timers
表格
的libmysqld
嵌入式服务器库被删除,以及:
的<一个class="ulink" href="//www.delbede.com/doc/c-api/8.0/en/mysql-options.html" target="_top">mysql_options ()
MYSQL_OPT_GUESS_CONNECTION
,MYSQL_OPT_USE_EMBEDDED_CONNECTION
,MYSQL_OPT_USE_REMOTE_CONNECTION
,MYSQL_SET_CLIENT_IP
选项
的<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-config.html" title="">mysql_config——libmysqld-libs
,——embedded-libs
,——嵌入式
选项
的CMakeWITH_EMBEDDED_SERVER
,WITH_EMBEDDED_SHARED_LIBRARY
,INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR
选项
(无证)<一个class="link" href="//www.delbede.com/doc/refman/en/mysql.html" title="">mysql——server-arg
选项
的mysqltest——嵌入式服务器
,——server-arg
,——服务器文件
选项
的mysqltest_embedded和mysql_client_test_embedded测试程序
的mysql_plugin效用被移除。方法在服务器启动时加载插件<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——plugin-load
或<一个class="link" href="//www.delbede.com/doc/refman/en/server-options.html">——plugin-load-add
选项,或在运行时使用<一个class="link" href="//www.delbede.com/doc/refman/en/install-plugin.html" title="">安装插件
声明。
的resolveip实用程序被删除。网路资讯查询,宿主,或挖可以代替。
的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_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_supportEr_dump_not_implemented er_error_during_checkpoint er_error_on_close er_event_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_signalER_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
和<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-lock-waits-table.html" title="">INNODB_LOCK_WAITS
桌子被移走了。使用性能模式<一个class="link" href="//www.delbede.com/doc/refman/en/performance-schema-data-locks-table.html" title="">data_locks
和<一个class="link" href="//www.delbede.com/doc/refman/en/performance-schema-data-lock-waits-table.html" title="">data_lock_waits
表。
在MySQL 5.7中,LOCK_TABLE
列中<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-locks-table.html" title="">INNODB_LOCKS
表和locked_table
列中sys
模式<一个class="link" href="//www.delbede.com/doc/refman/en/sys-innodb-lock-waits.html" title="">innodb_lock_waits
和<一个class="link" href="//www.delbede.com/doc/refman/en/sys-innodb-lock-waits.html" title="">x美元innodb_lock_waits
视图包含组合的模式/表名值。在MySQL 8.0中,<一个class="link" href="//www.delbede.com/doc/refman/en/performance-schema-data-locks-table.html" title="">data_locks
表和sys
模式视图包含单独的模式名和表名列。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/sys-innodb-lock-waits.html" title="第28.4.3.9节,“innodb_lock_waits和x$innodb_lock_waits视图”">第28.4.3.9节,“innodb_lock_waits和x$innodb_lock_waits视图”一个>.
InnoDB
不再支持压缩临时表。当<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_strict_mode
已启用(默认值),<一个class="link" href="//www.delbede.com/doc/refman/en/create-table.html" title="">创建临时表
返回一个错误ROW_FORMAT =压缩
或KEY_BLOCK_SIZE
都是确定的。如果<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_strict_mode
则会发出警告,并使用非压缩的行格式创建临时表。
InnoDB
不再创造.isl
文件(InnoDB
在MySQL数据目录之外创建表空间数据文件时使用符号链接文件。的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_directories
选项现在支持定位在数据目录之外创建的表空间文件。
通过此更改,可以在服务器脱机时通过手动修改.isl
文件不再被支持。方法支持移动远程表空间文件<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_directories
选择。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-moving-data-files-offline.html" title="第15.6.3.6节“服务器离线时移动表空间文件”">第15.6.3.6节“服务器离线时移动表空间文件”一个>.
以下InnoDB
文件格式变量被删除:
文件格式变量是创建与早期版本兼容的表所必需的InnoDB
在MySQL 5.1中现在MySQL 5.1已经到了其产品生命周期的末期,不再需要这些选项了。
的FILE_FORMAT
列从<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tables-table.html" title="">INNODB_TABLES
和<一个class="link" href="//www.delbede.com/doc/refman/en/information-schema-innodb-tablespaces-table.html" title="">INNODB_TABLESPACES
信息模式表。
的innodb_support_xa
删除了system变量,该变量支持在XA事务中进行两阶段提交。InnoDB
在XA事务中始终启用对两阶段提交的支持。
删除了对DTrace的支持。
的JSON_APPEND ()
功能被删除。使用<一个class="link" href="//www.delbede.com/doc/refman/en/json-modification-functions.html">JSON_ARRAY_APPEND ()
代替。
支持将表分区放在共享中InnoDB
在MySQL 8.0.13中删除了表空间。共享的表空间包括InnoDB
系统表空间和一般表空间。有关在共享表空间中识别分区并将其移动到每个表文件的表空间的信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/upgrade-prerequisites.html" title="第2.11.5节,为升级准备安装">第2.11.5节,为升级准备安装一个>.
支持在语句中设置用户变量,而不是<一个class="link" href="//www.delbede.com/doc/refman/en/set-variable.html" title="">集
已在MySQL 8.0.13中弃用。该功能将在MySQL 9.0中删除。
的——ndb
perror选项被删除。使用<一个class="link" href="//www.delbede.com/doc/refman/en/mysql-cluster-programs-ndb-perror.html" title="">ndb_perror实用程序。
的innodb_undo_logs
变量被移除。的<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_rollback_segments
变量执行相同的功能,应该使用它。
的Innodb_available_undo_logs
状态变量被移除。每个表空间可用回滚段的数量可以使用显示变量为innodb_rollback_segments;
从MySQL 8.0.14开始,先前已弃用<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-parameters.html">innodb_undo_tablespaces
变量不再可配置。有关更多信息,请参见<一个class="xref" href="//www.delbede.com/doc/refman/en/innodb-undo-tablespaces.html" title="第15.6.3.4节“撤销表空间”">第15.6.3.4节“撤销表空间”一个>.
支持修改表…升级分区
声明已被删除。
从MySQL 8.0.16开始,支持<一个class="link" href="//www.delbede.com/doc/refman/en/server-system-variables.html">internal_tmp_disk_storage_engine
系统变量已被删除;磁盘上的内部临时表现在总是使用<一个class="link" href="//www.delbede.com/doc/refman/en/innodb-storage-engine.html" title="">InnoDB
存储引擎。看到<一个class="xref" href="//www.delbede.com/doc/refman/en/internal-temporary-tables.html" title="磁盘上内部临时表的存储引擎">磁盘上内部临时表的存储引擎一个>,以获取更多资讯。
的<一个class="link" href="//www.delbede.com/doc/refman/en/source-configuration-options.html">DISABLE_SHARED
CMake选项未使用,已被删除。