MySQL8新特性
2020年4月25日17:50:07
官方URL:https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html
1.4 MySQL 8.0的新增功能
本节总结了已添加到MySQL 8.0中,已弃用和从MySQL 8.0中删除的内容。随附的部分列出了在MySQL 8.0中已添加,不建议使用或删除的MySQL服务器选项和变量。请参见 第1.5节“在MySQL 8.0中添加,不建议使用或删除的服务器和状态变量及选项”。
以下功能已添加到MySQL 8.0:
-
数据字典。 MySQL现在合并了一个事务性数据字典,用于存储有关数据库对象的信息。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。有关更多信息,请参见第14章,MySQL数据字典。
-
原子数据定义语句(Atomic DDL)。 原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中。有关更多信息,请参见 第13.1.1节“原子数据定义语句支持”。
-
升级程序。 以前,在安装新版本的MySQL之后,MySQL服务器会在下次启动时自动升级数据字典表,此后,DBA 应该 手动调用mysql_upgrade来升级
mysql模式中的系统表 以及其他模式中的对象。架构,例如sys架构和用户架构。从MySQL 8.0.16开始,服务器执行以前由mysql_upgrade处理的任务。在安装新的MySQL版本之后,服务器现在将在下次启动时自动执行所有必要的升级任务,而不依赖于DBA调用 mysql_upgrade。另外,服务器会更新帮助表的内容( mysql_upgrade并未执行此操作)。新的
--upgrade服务器选项可控制服务器如何执行自动数据字典和服务器升级操作。有关更多信息,请参见 第2.11.3节“ MySQL升级过程将升级什么”。 -
安全性和帐户管理。 添加了这些增强功能,以提高安全性并在帐户管理中提供更大的DBA灵活性:
-
mysql现在 ,系统数据库中的授权表是InnoDB(事务性)表。以前,这些是MyISAM(非事务性)表。授予表存储引擎的更改是帐户管理对帐单行为的伴随更改的基础。以前,帐户管理对帐单(例如CREATE USER或DROP USER),命名多个用户可以对某些用户成功,而对其他用户则失败。现在,每个语句都是事务性的,并且对于所有命名的用户都成功,或者回滚,并且在发生任何错误时都不起作用。如果成功,则将语句写入二进制日志;如果失败,则不写入语句。在这种情况下,将发生回滚并且不进行任何更改。有关更多信息,请参见第13.1.1节“原子数据定义语句支持”。 -
一个新的
caching_sha2_password身份验证插件可用。像sha256_password插件一样 ,caching_sha2_password实现SHA-256密码哈希,但是使用缓存来解决连接时的延迟问题。它还支持更多的连接协议,并且不需要针对基于RSA密钥对的密码交换功能而针对OpenSSL进行链接。请参见 第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。有关此默认插件更改对服务器操作以及服务器与客户端和连接器的兼容性的影响的信息,请参阅 caching_sha2_password作为首选身份验证插件。 -
MySQL现在支持角色,这些角色被称为特权集合。可以创建和删除角色。角色可以具有授予和撤销的特权。可以向用户帐户授予角色或从用户帐户撤消角色。可以从授予该帐户的角色中选择该帐户的活动适用角色,并且可以在该帐户的会话期间进行更改。有关更多信息,请参见第6.2.10节“使用角色”。
-
MySQL现在合并了用户帐户类别的概念,根据系统用户和普通用户是否具有
SYSTEM_USER特权来区分它们 。请参见第6.2.11节“帐户类别”。 -
以前,除了某些模式之外,不可能授予全局适用的特权。现在,如果
partial_revokes启用了 系统变量,则可以这样做。请参见 第6.2.12节“使用部分撤销的权限限制”。 -
该
GRANT语句有一个子句,用于指定有关用于语句执行的特权上下文的其他信息。该语法在SQL级别上可见,尽管其主要目的是通过使这些限制出现在二进制日志中,从而在跨部分撤销的授予者特权限制的所有节点上实现统一复制。请参见 第13.7.1.6节“ GRANT语句”。ASuser[WITH ROLE] -
MySQL现在维护有关密码历史记录的信息,从而限制了对先前密码的重用。DBA可能要求在一定数量的密码更改或一段时间内,不要从以前的密码中选择新密码。可以在全局范围内以及每个帐户基础上建立密码重用策略。
现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使DBA可以防止用户在不证明他们知道当前密码的情况下更改密码。可以在全局范围内以及每个帐户基础上建立密码验证策略。
现在允许帐户具有双重密码,这使得在复杂的多服务器系统中无缝执行阶段性密码更改而无需停机。
MySQL现在使管理员能够配置用户帐户,以使由于密码错误而导致的连续登录失败过多,从而导致临时帐户锁定。所需的失败次数和锁定时间可以每个帐户配置。
这些新功能使DBA可以更全面地控制密码管理。有关更多信息,请参见第6.2.15节“密码管理”。
-
如果使用OpenSSL进行编译,MySQL现在支持FIPS模式,并且在运行时可以使用OpenSSL库和FIPS对象模块。FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。请参见第6.5节“ FIPS支持”。
-
服务器用于新连接的TLS上下文现在可以在运行时重新配置。例如,此功能可能很有用,可避免重启已经运行了很长时间以至于其SSL证书已过期的MySQL服务器。请参阅 服务器端运行时配置和监视加密连接。
-
如果服务器和客户端都使用OpenSSL 1.1.1或更高版本进行编译,则OpenSSL 1.1.1支持TLS v1.3协议进行加密连接,而MySQL 8.0.16和更高版本也支持TLS v1.3。请参见 第6.3.2节“加密的连接TLS协议和密码”。
-
现在,MySQL将授予命名管道上的客户端的访问控制设置为在Windows上成功进行通信所必需的最低限度。较新的MySQL客户端软件无需任何其他配置即可打开命名管道连接。如果不能立即升级旧的客户端软件,
named_pipe_full_access_group则可以使用新的 系统变量为Windows组授予打开命名管道连接所需的权限。完全访问组的成员资格应受到限制且是临时的。
-
-
资源管理。 MySQL现在支持创建和管理资源组,并允许将服务器中运行的线程分配给特定的组,以便线程根据该组可用的资源执行。使用组属性可以控制其资源,以启用或限制组中线程的资源消耗。DBA可以根据不同的工作负载修改这些属性。当前,CPU时间是一种可管理的资源,以“ 虚拟CPU ”的概念表示这个术语包括CPU内核,超线程,硬件线程等。服务器在启动时确定有多少个虚拟CPU可用,具有适当特权的数据库管理员可以将这些CPU与资源组关联,并为组分配线程。有关更多信息,请参见 第5.1.15节“资源组”。
-
表加密管理。 现在可以通过定义和强制执行加密默认值来全局管理表加密。该
default_table_encryption变量为新创建的模式和常规表空间定义加密默认值。DEFAULT ENCRYPTION创建模式时,也可以使用子句定义模式的加密默认值。默认情况下,表继承对其创建的架构或常规表空间的加密。加密默认值通过启用table_encryption_privilege_check变量。当使用不同于设置的加密设置创建或更改模式或常规表空间default_table_encryption时,或者当使用不同于默认模式加密的加密设置创建或更改表时,将进行特权检查 。 启用该TABLE_ENCRYPTION_ADMIN特权后,将允许覆盖默认的加密设置table_encryption_privilege_check。有关更多信息,请参见 为架构和常规表空间定义加密默认值。 -
InnoDB增强功能。 这些
InnoDB增强功能已添加:-
每次值更改时,当前最大自动增量计数器值都会写入重做日志,并保存到每个检查点的引擎专用系统表中。这些更改使当前的最大自动增量计数器值在服务器重新启动后保持不变。另外:
有关更多信息,请参见 第15.6.1.6节“ InnoDB中的AUTO_INCREMENT处理”和 InnoDB AUTO_INCREMENT计数器初始化。
-
遇到索引树损坏时,
InnoDB将损坏标志写入重做日志,这会使损坏标志崩溃。InnoDB还将内存损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间,InnoDB在将内存表和索引对象标记为已损坏之前,从两个位置读取损坏标志并合并结果。 -
的
InnoDBmemcached的插件支持多个get操作(读取在一个单一的多键-值对分布式缓存 查询)和范围查询。请参见 第15.20.4节“ InnoDB memcached多重获取和范围查询支持”。 -
新的动态变量
innodb_deadlock_detect可以用于禁用死锁检测。在高并发系统上,当多个线程等待相同的锁时,死锁检测会导致速度变慢。有时,禁用死锁检测并在innodb_lock_wait_timeout发生死锁时依靠设置进行事务回滚可能会更有效 。 -
新
INFORMATION_SCHEMA.INNODB_CACHED_INDEXES表报告InnoDB每个索引在缓冲池中缓存的索引页数 。 -
InnoDB现在在共享临时表空间中创建临时表ibtmp1。 -
InnoDB支持NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。NOWAIT如果请求的行被另一个事务锁定,则导致该语句立即返回。SKIP LOCKED从结果集中删除锁定的行。请参阅 使用NOWAIT和SKIP LOCKED锁定读取并发。SELECT ... FOR SHAREreplacesSELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容。这些语句是等效的。然而,FOR UPDATE和FOR SHARE支持NOWAIT,SKIP LOCKED和选项。请参见第13.2.10节“ SELECT语句”。OFtbl_nameOF将锁定查询应用于命名表。tbl_name -
ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITIONALTER TABLE选项由本地分区就地API的支持,可能与使用ALGORITHM={COPY|INPLACE}和LOCK条款。DROP PARTITION与一起ALGORITHM=INPLACE删除分区中存储的数据并删除分区。但是,DROP PARTITION使用ALGORITHM=COPY或old_alter_table=ON重建分区表,并尝试将数据从删除的分区移动到具有兼容PARTITION ... VALUES定义的另一个分区。无法删除的数据将被删除。 -
InnoDB现在 ,存储引擎使用MySQL数据字典,而不是其自己的特定于存储引擎的数据字典。有关数据字典的信息,请参见 第14章,MySQL数据字典。 -
mysql现在,在MySQL数据目录中InnoDB命名的单个表空间文件中 创建系统表和数据字典表mysql.ibd。以前,这些表是InnoDB在mysql数据库目录中的单个表空间文件中创建的。 -
MySQL 8.0中引入了以下撤消表空间更改:
-
默认情况下,撤消日志现在位于初始化MySQL实例时创建的两个撤消表空间中。撤消日志不再在系统表空间中创建。
-
从MySQL 8.0.14开始,可以在运行时使用
CREATE UNDO TABLESPACE语法在选定位置创建其他撤消表空间 。CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';使用
CREATE UNDO TABLESPACE语法创建的撤消表空间 可以在运行时使用DROP UNDO TABLESPACE语法删除 。DROP UNDO TABLESPACE tablespace_name;ALTER UNDO TABLESPACE语法可用于将撤消表空间标记为活动或不活动。ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};甲
STATE,显示了表空间的状态列被添加到INFORMATION_SCHEMA.INNODB_TABLESPACES表中。撤消表空间必须处于empty状态后才能删除。 -
innodb_undo_log_truncate默认情况下启用 该 变量。 -
该
innodb_rollback_segments变量定义每个撤消表空间的回滚段数。以前,innodb_rollback_segments指定了MySQL实例的回滚段总数。此更改增加了可用于并发事务的回滚段的数量。更多的回滚段会增加并发事务将单独的回滚段用于撤消日志的可能性,从而减少资源争用。
-
-
修改了影响缓冲池预刷新和刷新行为的变量的默认值:
-
现在
innodb_max_dirty_pages_pct_lwm默认值为10。先前的默认值0禁用缓冲池预刷新。当缓冲池中的脏页百分比超过10%时,值为10启用预刷新。启用预冲洗可提高性能一致性。 -
将
innodb_max_dirty_pages_pct默认值从75到90。增加InnoDB尝试刷新的数据从缓冲池,使脏页的百分比不超过这个值。增加的默认值允许缓冲池中脏页的百分比更高。
-
-
现在默认
innodb_autoinc_lock_mode设置为2(交错)。交错锁定模式允许并行执行多行插入,从而提高了并发性和可伸缩性。新的innodb_autoinc_lock_mode默认设置反映了从基于语句的复制到基于行的复制的更改,这是MySQL 5.7中的默认复制类型。基于语句的复制需要连续的自动增量锁定模式(以前的默认设置),以确保按照给定的SQL语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制对SQL语句不敏感。 SQL语句的执行顺序。有关更多信息,请参见 InnoDB AUTO_INCREMENT锁定模式。对于使用基于语句的复制的系统,新的
innodb_autoinc_lock_mode默认设置可能会破坏依赖于顺序自动增量值的应用程序。要恢复以前的默认设置,请设置innodb_autoinc_lock_mode为1。 -
ALTER TABLESPACE ... RENAME TO语法 支持重命名常规表空间 。 -
innodb_dedicated_server默认情况下禁用 的新 变量可用于InnoDB根据服务器上检测到的内存量自动配置以下选项:该选项适用于在专用服务器上运行的MySQL服务器实例。有关更多信息,请参见 第15.8.12节“为专用的MySQL服务器启用自动配置”。
-
新
INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF视图为表空间提供空间,名称,路径,标志和空间类型数据InnoDB。 -
与MySQL捆绑在一起 的zlib库版本从1.2.3版本提高到1.2.11版本。MySQL在zlib库的帮助下实现了压缩。
如果使用
InnoDB压缩表,请参见第2.11.4节“ MySQL 8.0中的更改”以了解相关的升级含义。 -
InnoDB除全局临时表空间和撤消表空间文件外 ,所有表空间文件中都存在序列化字典信息(SDI)。SDI是表和表空间对象的序列化元数据。SDI数据的存在提供了元数据冗余。例如,如果数据字典变得不可用,则可以从表空间文件中提取字典对象元数据。使用ibd2sdi工具执行SDI提取。SDI数据以JSON格式存储。在表空间文件中包含SDI数据会增加表空间文件的大小。SDI记录需要一个索引页,默认情况下大小为16KB。但是,在存储SDI数据时会对其进行压缩,以减少存储空间。
-
InnoDB现在 ,存储引擎支持原子DDL,即使服务器在操作期间停止运行,它也可以确保DDL操作完全提交或回退。有关更多信息,请参见第13.1.1节“原子数据定义语句支持”。 -
使用该
innodb_directories选项,在服务器脱机时可以将表空间文件移动或还原到新位置 。有关更多信息,请参见 第15.6.3.6节“在服务器脱机时移动表空间文件”。 -
实现了以下重做日志优化:
-
用户线程现在可以并发写入日志缓冲区,而无需同步写入。
-
用户线程现在可以按轻松的顺序将脏页添加到刷新列表中。
-
现在,专用的日志线程负责将日志缓冲区写入系统缓冲区,将系统缓冲区刷新到磁盘,通知用户线程有关已写入和已刷新的重做,维持宽松的刷新列表顺序所需的滞后时间以及写入检查点。
-
添加了系统变量,用于配置等待刷新重做的用户线程使用旋转延迟:
-
innodb_log_wait_for_flush_spin_hwm:定义最大平均日志刷新时间,超过该时间后,用户线程将在等待刷新重做时不再旋转。 -
innodb_log_spin_cpu_abs_lwm:定义最小CPU使用量,在该最小使用量之下,用户线程在等待刷新重做时不再旋转。 -
innodb_log_spin_cpu_pct_hwm:定义最大CPU使用量,在该最大CPU使用量之上,用户线程在等待刷新重做时不再旋转。
-
-
的
innodb_log_buffer_size变量是现在动态的,服务器运行时其允许调整大小日志缓冲区的。
有关更多信息,请参见 第8.5.4节“优化InnoDB重做日志”。
-
-
从MySQL 8.0.12开始,对于大对象(LOB)数据的小型更新,支持撤消日志记录,从而提高了大小为100字节或更小的LOB更新的性能。以前,LOB更新的大小至少为一个LOB页,对于可能只修改几个字节的更新而言,这不是最佳的。此增强功能基于MySQL 8.0.4中添加的对LOB数据的部分更新的支持。
-
从MySQL 8.0.12开始,
ALGORITHM=INSTANT以下ALTER TABLE操作受支持 :-
添加一列。此功能也称为 “ 即时
ADD COLUMN”。有限制条件。请参见 第15.12.1节“在线DDL操作”。 -
添加或删除虚拟列。
-
添加或删除列默认值。
-
更改索引类型。
-
重命名表。
ALGORITHM=INSTANT仅 支持的操作会 修改数据字典中的元数据。在表上没有采取任何元数据锁,并且表数据不受影响,从而使操作立即进行。如果未明确指定,ALGORITHM=INSTANT默认情况下由支持它的操作使用。如果ALGORITHM=INSTANT指定但不支持,则操作立即失败并显示错误。有关支持的操作的更多信息
ALGORITHM=INSTANT,请参见 第15.12.1节“在线DDL操作”。 -
-
从MySQL 8.0.13开始,
TempTable存储引擎支持二进制大对象(BLOB)类型列的存储。此增强功能提高了使用包含BLOB数据的临时表的查询的性能。以前,包含BLOB数据的临时表存储在定义的磁盘存储引擎中internal_tmp_disk_storage_engine。有关更多信息,请参见 第8.4.4节“ MySQL中的内部临时表使用”。 -
从MySQL 8.0.13开始,静态
InnoDB数据加密功能支持常规表空间。以前,只能加密每表文件表空间。一般的表空间支持加密,CREATE TABLESPACE和ALTER TABLESPACE语法扩展到包括ENCRYPTION条款。该
INFORMATION_SCHEMA.INNODB_TABLESPACES表现在包括一ENCRYPTION列,该列指示表空间是否已加密。在
stage/innodb/alter tablespace (encryption)加入绩效模式阶段仪器允许监测一般表的加密操作。 -
禁用该
innodb_buffer_pool_in_core_file变量可通过排除InnoDB缓冲池页面来减少核心文件的大小 。要使用此变量,core_file必须启用该变量,并且操作系统必须支持Linux 3.4及更高版本支持的的MADV_DONTDUMP非POSIX扩展madvise()。有关更多信息,请参见第15.8.3.7节“从核心文件中排除缓冲池页面”。 -
从MySQL 8.0.13开始,由用户创建的临时表和由优化程序创建的内部临时表存储在会话临时表空间中,该会话临时表空间是从临时表空间池中分配给会话的。当会话断开连接时,其临时表空间将被截断并释放回池中。在以前的版本中,临时表是在全局临时表空间(
ibtmp1)中创建的,在删除临时表后,该表不会将磁盘空间返回给操作系统。该
innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是#innodb_temp数据目录中的目录。该
INNODB_SESSION_TEMP_TABLESPACES表提供有关会话临时表空间的元数据。现在,全局临时表空间(
ibtmp1)存储了回滚段,用于对用户创建的临时表所做的更改。 -
从MySQL 8.0.14开始,
InnoDB支持并行聚集索引读取,这可以提高CHECK TABLE性能。此功能不适用于二级索引扫描。的innodb_parallel_read_threads并行聚簇索引读取发生会话变量必须被设置为一个大于1的值。默认值为4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树的数量确定 ,以较小者为准。 -
从8.0.14开始,
innodb_dedicated_server启用该 变量后,将根据自动配置的缓冲池大小来配置日志文件的大小和数量。以前,日志文件的大小是根据在服务器上检测到的内存量来配置的,并且日志文件的数量不是自动配置的。 -
从8.0.14开始,该 语句的
ADD DATAFILE子句CREATE TABLESPACE是可选的,它允许没有FILE特权的用户 创建表空间。一个CREATE TABLESPACE没有执行的语句ADD DATAFILE子句隐式地创建一个独特的文件名的表空间的数据文件。 -
默认情况下,当TempTable存储引擎占用的内存量超过该
temptable_max_ram变量定义的内存限制时 ,TempTable存储引擎将开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始,此行为由temptable_use_mmap变量控制 。禁用temptable_use_mmap会使TempTable存储引擎将InnoDB磁盘内部临时表而不是内存映射文件用作其溢出机制。有关更多信息,请参阅 内部临时表存储引擎。 -
从MySQL 8.0.16开始,静态
InnoDB数据加密功能支持对mysql系统表空间的加密。该mysql系统表空间包含mysql系统数据库和MySQL数据字典表。有关更多信息,请参见 第15.13节“ InnoDB静态数据加密”。 -
innodb_spin_wait_pause_multiplierMySQL 8.0.16中引入 的 变量提供了对自旋锁轮询延迟持续时间的更好控制,自旋锁轮询延迟是在线程等待获取互斥量或rw锁时发生的。可以对延迟进行更精细的调整,以解决不同处理器体系结构上PAUSE指令持续时间的差异。有关更多信息,请参见 第15.8.8节“配置自旋锁定轮询”。 -
InnoDB在MySQL 8.0.17中,通过更好地利用读取线程,减少了并行扫描期间发生的预取活动的读取线程I / O来改善了大型数据集的并行读取线程性能,并支持了分区的并行扫描。并行读取线程功能由
innodb_parallel_read_threads变量控制 。现在,最大设置为256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。 -
innodb_idle_flush_pctMySQL 8.0.18中引入 的 变量允许限制空闲期间的页面刷新,这可以帮助延长固态存储设备的寿命。请参见 在空闲期间限制缓冲区刷新。 -
InnoDB从MySQL 8.0.19开始,为了生成直方图统计数据,已经 对数据进行了有效采样。请参见 直方图统计分析。 -
从MySQL 8.0.20开始,doublewrite缓冲区存储区位于doublewrite文件中。在以前的版本中,存储区位于系统表空间中。将存储区域移出系统表空间可减少写延迟,增加吞吐量并提供关于双写缓冲区页放置的灵活性。为高级双写缓冲区配置引入了以下系统变量:
-
定义双写缓冲区文件目录。
-
定义双写文件的数量。
-
定义批量写入中最大双写页数。
-
定义要批量写入的双写页面数。
有关更多信息,请参见 第15.6.4节“ Doublewrite缓冲区”。
-
-
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分析等待图表以更新交易计划权重的次数。
有关更多信息,请参见 第15.7.6节“事务调度”。
-
-
-
字符集支持。 默认字符集已从更改
latin1为utf8mb4。该utf8mb4字符集有几个新的排序规则,其中包括utf8mb4_ja_0900_as_cs,提供对Unicode在MySQL中第一个日本语言特定的排序。有关更多信息,请参见 第10.10.1节“ Unicode字符集”。 -
JSON增强。 对MySQL的JSON功能进行了以下增强或添加:
-
添加了
->>(内联路径)运算符,等效于调用JSON_UNQUOTE()的结果JSON_EXTRACT()。这是
->对MySQL 5.7中引入的列路径运算符的改进 ;col->>"$.path"等同于JSON_UNQUOTE(col->"$.path")。内联路径运算符可以用来随时随地可以使用JSON_UNQUOTE(JSON_EXTRACT()),如SELECT列清单,WHERE和HAVING条款,并ORDER BY和GROUP BY条款。有关更多信息,请参见运算符的描述以及JSON Path Syntax。 -
添加了两个JSON聚合函数
JSON_ARRAYAGG()和JSON_OBJECTAGG()。JSON_ARRAYAGG()将列或表达式作为其参数,并将结果聚合为单个JSON数组。该表达式可以求值为任何MySQL数据类型;这不一定是一个JSON值。JSON_OBJECTAGG()接受两列或表达式,将其解释为键和值;它以单个JSON对象的形式返回结果。有关更多信息和示例,请参见 第12.20节“聚合(GROUP BY)函数”。 -
添加了JSON实用程序功能
JSON_PRETTY(),该功能JSON以易于阅读的格式输出现有值;每个JSON对象成员或数组值都打印在单独的一行上,并且子对象或数组相对于其父对象要有2个空格。此函数还可以与可解析为JSON值的字符串一起使用。
有关更多详细信息和示例,请参见 第12.17.8节“ JSON实用程序函数”。
-
现在,
JSON使用来对查询中的值进行 排序时ORDER BY,每个值现在都由sort键的可变长度部分表示,而不是由固定的1K大小的一部分表示。在许多情况下,这可以减少过多的使用。例如,标量INT或什至BIGINT值实际上需要很少的字节,因此该空间的其余部分(最多90%或更多)被填充占用了。此更改具有以下性能优势:-
现在可以更有效地使用排序缓冲区空间,因此文件排序不需要像固定长度排序键那样早或经常刷新到磁盘。这意味着可以在内存中整理更多数据,避免不必要的磁盘访问。
-
比起较长的键,可以更快地比较较短的键,从而显着提高性能。对于完全在内存中执行的排序以及需要写入磁盘和从磁盘读取的排序,都是如此。
-
-
在MySQL 8.0.2中增加了对
JSON列值的部分就地更新的支持,这比完全删除现有JSON值并在其位置写入一个新的JSON效率更高,就像以前在更新任何JSON列时所做的那样 。要应用这种优化,更新,必须使用应用JSON_SET(),JSON_REPLACE()或JSON_REMOVE()。无法将新元素添加到要更新的JSON文档中;文档中的值不能占用比更新前更多的空间。请参阅 JSON值的部分更新,以详细讨论要求。可以将JSON文档的部分更新写入二进制日志,比记录完整的JSON文档占用更少的空间。在使用基于语句的复制时,始终会记录部分更新。为了使其与基于行的复制一起使用,必须首先设置
binlog_row_value_options=PARTIAL_JSON; 有关更多信息,请参见此变量的说明。 -
添加了JSON实用程序功能
JSON_STORAGE_SIZE()和JSON_STORAGE_FREE()。JSON_STORAGE_SIZE()在任何部分更新之前,返回用于JSON文档的二进制表示形式的存储空间(以字节为单位)(请参阅上一项)。JSON_STORAGE_FREE()显示JSON使用JSON_SET()或 部分更新的类型的表列中剩余的空间量JSON_REPLACE()。如果新值的二进制表示形式小于先前值的二进制表示形式,则该值大于零。这些函数中的每一个还接受JSON文档的有效字符串表示形式。对于此值,
JSON_STORAGE_SIZE()返回其二进制表示形式转换为JSON文档后使用的空间。对于包含JSON文档的字符串表示形式的变量,JSON_STORAGE_FREE()返回零。如果无法将其(非null)参数解析为有效的JSON文档,并且NULL参数为,则 任何一个函数都会产生错误NULL。有关更多信息和示例,请参见 第12.17.8节“ JSON实用程序函数”。
JSON_STORAGE_SIZE()并JSON_STORAGE_FREE()在MySQL 8.0.2中实现。 -
在MySQL 8.0.2中增加了对
$[1 to 5]XPath表达式等范围的支持 。在此版本中还增加了对last关键字和相对寻址的支持,因此$[last]始终选择数组中的最后一个(最高编号)元素以及$[last-1]最后一个相邻元素。last使用它的表达式也可以包含在范围定义中。例如,$[last-2 to last-1]返回最后两个元素,但返回数组中的一个。有关其他信息和示例,请参见 搜索和修改JSON值。 -
添加了旨在符合RFC 7396的JSON合并功能 。
JSON_MERGE_PATCH(),当用于2个JSON对象时,将它们合并为一个JSON对象,该对象具有以下集合的并集:-
第一个对象的每个成员,在第二个对象中不存在具有相同键的成员。
-
第二个对象的每个成员,在第一个对象中没有成员具有相同的键,并且其值不是JSON
null文字。 -
每个成员都具有在两个对象中都存在的键,并且其第二个对象中的值不是JSON
null文字。
作为这项工作的一部分,该
JSON_MERGE()功能已重命名JSON_MERGE_PRESERVE()。JSON_MERGE()仍然被认为是JSON_MERGE_PRESERVE()MySQL 8.0 的别名 ,但现在已弃用,并可能在将来的MySQL版本中删除。有关更多信息和示例,请参见 第12.17.4节“修改JSON值的函数”。
-
-
实现重复密钥的 “ 最后重复密钥获胜 ” 规范化,与 RFC 7159和大多数JavaScript解析器一致。此行为的示例在此处显示,其中仅
x保留具有密钥的最右边的成员:mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]', > 'x', '"abc"', 'x', '100') AS Result; +------------------------------------+ | Result | +------------------------------------+ | {"x": "100", "y": "[true, false]"} | +------------------------------------+ 1 row in set (0.00 sec)插入MySQL
JSON列中的值 也以这种方式标准化,如以下示例所示:mysql> CREATE TABLE t1 (c1 JSON); mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}'); mysql> SELECT c1 FROM t1; +------------------+ | c1 | +------------------+ | {"x": [3, 5, 7]} | +------------------+与以前的MySQL版本相比,这是一个不兼容的更改,以前的版本 在这种情况下使用了“ 首次重复键赢 ”算法。
有关更多信息和示例,请参见JSON值的规范化,合并和自动包装。
-
JSON_TABLE()在MySQL 8.0.4中 添加了该功能。此函数接受JSON数据,并将其作为具有指定列的关系表返回。此函数的语法为 ,其中 是返回JSON数据的表达式,是应用于源的JSON路径以及 列定义的列表。这里显示一个示例:
JSON_TABLE(expr,pathCOLUMNScolumn_list) [AS]alias)exprpathcolumn_listmysql> SELECT * -> FROM -> JSON_TABLE( -> '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]', -> "$[*]" COLUMNS( -> rowid FOR ORDINALITY, -> -> xa INT EXISTS PATH "$.a", -> xb INT EXISTS PATH "$.b", -> -> sa VARCHAR(100) PATH "$.a", -> sb VARCHAR(100) PATH "$.b", -> -> ja JSON PATH "$.a", -> jb JSON PATH "$.b" -> ) -> ) AS jt1; +-------+------+------+------+------+------+--------+ | rowid | xa | xb | sa | sb | ja | jb | +-------+------+------+------+------+------+--------+ | 1 | 1 | 1 | 3 | 0 | 3 | "0" | | 2 | 1 | 1 | 3 | 1 | "3" | "1" | | 3 | 1 | 1 | 2 | 1 | 2 | 1 | | 4 | 1 | 0 | 0 | NULL | 0 | NULL | | 5 | 0 | 1 | NULL | NULL | NULL | [1, 2] | +-------+------+------+------+------+------+--------+JSON源表达式可以是产生有效JSON文档的任何表达式,包括JSON文字,表列或返回JSON的函数调用,例如
JSON_EXTRACT(t1, data, '$.post.comments')。有关更多信息,请参见 第12.17.6节“ JSON表函数”。
-
-
数据类型支持。 MySQL现在支持将表达式用作数据类型规范中的默认值。这包括使用表达式作为默认值
BLOB,TEXT,GEOMETRY,和JSON数据类型,这在以前是根本不会被分配缺省值。有关详细信息,请参见第11.6节“数据类型默认值”。 -
优化器。 添加了这些优化器增强功能:
-
MySQL现在支持不可见索引。优化器根本不会使用不可见的索引,但是它通常会得到维护。默认情况下,索引可见。不可见的索引可以测试删除索引对查询性能的影响,而无需进行破坏性的更改,如果需要该索引,则必须撤消该更改。请参见 第8.3.12节“不可见索引”。
-
MySQL现在支持降序索引:
DESC索引定义不再被忽略,而是导致键值以降序存储。以前,索引可以以相反的顺序进行扫描,但会降低性能。降序索引可以按向前顺序进行扫描,这样效率更高。当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化程序可以使用多列索引。请参见第8.3.13节“降序索引”。 -
MySQL现在支持创建索引表达式值而不是列值的功能索引键部分。功能性关键部分支持对无法通过其他方式索引的值(例如
JSON值)进行索引 。有关详细信息,请参见第13.1.15节“ CREATE INDEX语句”。 -
在MySQL 8.0.14和更高版本中,
WHERE在准备过程中而不是在优化过程中删除了常量常量表达式引起的琐碎 条件。在过程的早期删除条件可以简化具有琐碎条件的外部联接的查询的联接,例如:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1现在,优化器在准备过程中会看到0 = 1始终为false,从而使其具有
OR 0 = 1冗余性,并将其删除,从而保持以下状态:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2现在,优化器可以将查询重写为内部联接,如下所示:
SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2有关更多信息,请参见 第8.2.1.9节“外部联接优化”。
-
在MySQL 8.0.16及更高版本中,MySQL可以在优化时使用常量折叠来处理列与常量值之间的比较,其中常量超出范围或相对于列的类型在范围边界上,而不是执行因此对于执行时的每一行。例如,给定一个
t带有TINYINT UNSIGNED列的表c,优化器可以重写条件,例如WHERE c < 256toWHERE 1(并完全优化该条件)或WHERE c >= 255toWHERE c = 255。有关更多信息,请参见第8.2.1.14节“恒定折叠优化”。
-
从MySQL 8.0.16开始,与
IN子查询一起使用的半联接优化现在也可以应用于EXISTS子查询。另外,优化器现在WHERE在子查询所附加的条件下对琐碎相关的相等谓词进行解相关 ,以便可以将它们与子查询中的表达式进行类似的处理IN。这适用于EXISTS和IN子查询。有关更多信息,请参见第8.2.2.1节“使用半联接转换优化IN和EXISTS子查询谓词”。
-
在MySQL 8.0.17及更高版本中,
WHERE具有或 的条件在内部转换为反连接。(antijoin从表中返回所有与表中没有行匹配的行相匹配的行的行。)这将删除子查询,这会导致查询执行更快,因为该子查询的表现在在顶部处理水平。NOT IN (subquery)NOT EXISTS (subquery)这类似于并重用现有的
IS NULL(Not exists)外连接优化。请参阅 EXPLAIN Extra Information。
-
-
常用表表达式。 MySQL现在支持通用表表达式,包括非递归和递归的。公用表表达式允许使用命名的临时结果集,该方法通过允许在
WITH语句之前的子句SELECT和某些其他语句来实现。有关更多信息,请参见 第13.2.15节“ WITH(公用表表达式)”。从MySQL 8.0.19开始,
SELECT递归公用表表达式(CTE)的递归 部分支持LIMIT子句。LIMIT与OFFSET也支持。有关更多信息,请参见 递归公用表表达式。 -
窗口功能。 MySQL现在支持窗口函数,对于查询的每一行,都使用与该行相关的行来执行计算。这些包括诸如
RANK(),LAG(),和NTILE()。此外,现在可以将几个现有的聚合函数用作窗口函数(例如SUM()和AVG())。有关更多信息,请参见第12.21节“窗口函数”。 -
横向派生表。 现在,派生表之前可以带有
LATERAL关键字,以指定允许它引用(取决于)同一FROM子句中的先前表的列。横向派生表使某些SQL操作可能无法通过非横向派生表完成,或者需要效率较低的解决方法。请参见 第13.2.11.9节“侧面衍生表”。 -
单表DELETE语句中的别名。 在MySQL 8.0.16和更高版本中,单表
DELETE语句支持使用表别名。 -
正则表达式支持。 此前,MySQL的使用的亨利斯宾塞正则表达式库来支持正则表达式运算符(
REGEXP,RLIKE)。使用Unicode国际组件(ICU)重新实现了对正则表达式的支持,该组件提供了完整的Unicode支持并且是多字节安全的。该REGEXP_LIKE()函数以REGEXP和RLIKE运算符的方式执行正则表达式匹配 ,它们现在是该函数的同义词。此外,REGEXP_INSTR(),REGEXP_REPLACE(),和REGEXP_SUBSTR()函数可用于查找匹配位置并分别执行子字符串替换和提取。该regexp_stack_limit和regexp_time_limit系统变量提供由发动机匹配了资源消耗的控制。有关更多信息,请参见 第12.7.2节“正则表达式”。有关实现更改可能影响使用正则表达式的应用程序的方式的信息,请参见 正则表达式兼容性注意事项。 -
内部临时表。 的
TempTable存储引擎替换MEMORY存储引擎作为默认发动机用于在内存中的内部临时表。该TempTable存储引擎提供了有效的存储VARCHAR和VARBINARY列。的internal_tmp_mem_storage_engine会话变量定义了用于在存储器内的临时表的存储引擎。允许的值为TempTable(默认值)和MEMORY。该temptable_max_ram变量定义TempTable在将数据存储到磁盘之前存储引擎可以使用的最大内存量 。 -
正在记录。 错误记录已重写为使用MySQL组件体系结构。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录则是可加载的组件。此外,还提供了可加载的JSON日志编写器。要控制要启用的日志组件,请使用
log_error_services系统变量。有关更多信息,请参见 第5.4.2节“错误日志”。 -
备用锁。 一种新型的备份锁允许在联机备份期间使用DML,同时防止可能导致快照不一致的操作。
LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE语法支持新的备份锁 。该BACKUP_ADMIN权限才能使用这些语句。 -
复制。 对MySQL复制进行了以下增强:
-
MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,从而在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过将新的
binlog_row_value_options系统变量设置为来启用PARTIAL_JSON。有关更多信息,请参见JSON值的部分更新以及的描述binlog_row_value_options。
-
-
连接管理。 MySQL服务器现在允许专门为管理连接配置TCP / IP端口。这提供了用于普通连接的网络接口上允许的单个管理连接的替代方法,即使
max_connections已经建立连接也是如此。请参见 第5.1.12.1节“连接接口”。MySQL现在提供了对压缩使用的更多控制,以最大程度地减少通过与服务器的连接发送的字节数。以前,给定的连接未压缩或已使用
zlib压缩算法。现在,也可以使用该zstd算法,并选择zstd连接的压缩级别。可以在服务器端以及连接原始端配置允许的压缩算法,以通过客户端程序以及参与主/从复制或组复制的服务器进行连接。有关更多信息,请参见 第4.2.6节“连接压缩控制”。 -
组态。 在整个MySQL中,主机名的最大允许长度已从以前的60个字符增加到255个ASCII字符。例如,这适用于数据字典中与主机名相关的列,
mysql系统架构,性能架构INFORMATION_SCHEMA和sys;陈述的MASTER_HOST价值CHANGE MASTER TO;语句输出中的Host列SHOW PROCESSLIST;帐户名称中的主机名(例如帐户管理对帐单和DEFINER属性);以及与主机名相关的命令选项和系统变量。注意事项:
-
允许的主机名长度增加会影响在主机名列上具有索引的表。例如,
mysql系统架构中索引主机名的表现在具有显式ROW_FORMAT属性,DYNAMIC以容纳更长的索引值。 -
某些基于文件名的配置设置可能是基于服务器主机名构造的。允许的值受基础操作系统的约束,该操作系统可能不允许文件名足够长以包含255个字符的主机名。这会影响到
general_log_file,log_error,pid_file,relay_log,和slow_query_log_file系统变量和相应的选项。如果基于主机名的值对于OS而言太长,则必须提供明确的较短值。 -
尽管服务器现在支持255个字符的主机名,但是与使用该
--ssl-mode=VERIFY_IDENTITY选项建立的服务器的连接 受到OpenSSL支持的最大主机名长度的限制。主机名匹配与SSL证书的两个字段有关,它们的最大长度如下:公用名:最大长度为64;最大名称为64。主题备用名称:根据RFC#1034的最大长度。
-
-
插件。 以前,MySQL插件可以用C或C ++编写。插件使用的MySQL头文件现在包含C ++代码,这意味着插件必须用C ++而不是C编写。
-
C API。 MySQL C API现在支持异步功能,用于与MySQL服务器的非阻塞通信。每个功能都是现有同步功能的异步对应项。如果从服务器连接读取或写入服务器连接,则必须等待同步功能。异步功能使应用程序可以检查服务器连接上的工作是否准备就绪。如果不是,则该应用程序可以执行其他工作,然后再进行检查。请参见 第28.7.11节“ C API异步接口”。
-
演员表的其他目标类型。 功能
CAST()和CONVERT()现在支持转换到类型DOUBLE,FLOAT和REAL。在MySQL 8.0.17中添加。请参见第12.10节“广播函数和运算符”。 -
JSON模式验证。 MySQL 8.0.17添加了两个功能
JSON_SCHEMA_VALID(),JSON_SCHEMA_VALIDATION_REPORT()用于再次验证JSON文档JSON模式。JSON_SCHEMA_VALID()如果文档根据模式进行验证,则返回TRUE(1),否则通过FALSE(0)返回。JSON_SCHEMA_VALIDATION_REPORT()返回一个JSON文档,其中包含有关验证结果的详细信息。以下语句适用于这两个功能:-
模式必须符合JSON模式规范的草案4。
-
required支持属性。 -
$ref不支持 外部资源和关键字。 -
支持正则表达式模式;无效模式将被静默忽略。
有关更多信息和示例,请参见第12.17.7节“ JSON模式验证函数”。
-
-
多值索引。 从MySQL 8.0.17开始,
InnoDB支持创建多值索引,该索引是在JSON存储值数组的列上定义的辅助索引,并且单个数据记录可以具有多个索引记录。这样的索引使用诸如的关键部分定义CAST(data->'$.zipcode' AS UNSIGNED ARRAY)。MySQL优化程序会自动将多值索引用于合适的查询,如的输出所示EXPLAIN。作为这项工作的一部分,MySQL添加了一个新功能
JSON_OVERLAPS()和一个MEMBER OF()用于处理JSON文档的新 运算符,此外,还CAST()使用一个新ARRAY关键字扩展了该 功能, 如下表所示:-
JSON_OVERLAPS()比较两个JSON文档。如果它们包含任何共同的键值对或数组元素,则该函数返回TRUE(1); 否则返回FALSE(0)。如果两个值都是标量,则该函数将执行一个简单的相等性测试。如果一个参数是JSON数组,另一个参数是标量,则将标量视为数组元素。因此,可JSON_OVERLAPS()作为的补充JSON_CONTAINS()。 -
MEMBER OF()测试第一个操作数(标量或JSON文档)是否是作为第二个操作数传递的JSON数组的成员,如果是则返回TRUE(1),否则返回FALSE(0)。不执行操作数的类型转换。 -
CAST(允许通过将在JSON文档中找到的JSON数组expressionAStypeARRAY)json_path转换为SQL数组来创建功能索引 。类型说明符仅限于由已经支持的那些CAST(),以除外BINARY(不支持)。CAST()(和ARRAY关键字)的这种用法 仅受支持InnoDB,并且仅用于创建多值索引。
有关多值索引的详细信息(包括示例),请参阅 多值索引。 第12.17.3节“搜索JSON值的函数”,提供了有关
JSON_OVERLAPS()和的 信息MEMBER OF()以及使用示例。 -
-
提示time_zone。 从MySQL 8.0.17开始,
time_zone使用可以提示会话变量SET_VAR。 -
重做日志归档。 从MySQL 8.0.17开始,
InnoDB支持重做日志归档。在执行备份操作时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,由于这些记录被覆盖,导致丢失重做日志记录。重做日志归档功能通过将重做日志记录顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件复制重做日志记录,从而避免潜在的数据丢失。有关更多信息,请参阅重做日志归档。 -
克隆插件。 从MySQL 8.0.17开始,MySQL提供了一个克隆插件,允许
InnoDB在本地或从远程MySQL服务器实例克隆数据。本地克隆操作将克隆的数据存储在运行MySQL实例的同一服务器或节点上。远程克隆操作通过网络将克隆的数据从施主MySQL服务器实例传输到发起克隆操作的接收者服务器或节点。克隆插件支持复制。除了克隆数据之外,克隆操作还从施主提取并传输复制坐标,并将其应用于接收者,从而可以使用克隆插件来配置组复制成员和复制从属。与复制大量事务相比,使用克隆插件进行配置要快得多,效率也更高。还可以将组复制成员配置为使用克隆插件作为替代的恢复方法,以便成员自动选择从种子成员中检索组数据的最有效方法。
有关更多信息,请参见第5.6.7节“克隆插件”和第18.4.3.1节“克隆分布式恢复”。
-
哈希联接优化。 从MySQL 8.0.18开始,只要联接中的每对表都至少包含一个等联接条件,就使用哈希联接。哈希联接不需要索引,并且在大多数情况下比块嵌套循环算法更有效。可以通过这种方式优化如此处所示的联接:
SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1; SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1)哈希联接还可以用于笛卡尔积-即,未指定联接条件时。
您可以使用
EXPLAIN FORMAT=TREE或查看何时将哈希联接优化用于特定查询EXPLAIN ANALYZE。可以使用
optimizer_switch系统变量的hash_join标志(on默认情况下)以及HASH_JOIN和NO_HASH_JOIN优化程序提示来控制哈希联接的使用 。哈希联接可用的内存量受的值限制
join_buffer_size。在磁盘上执行需要更多内存的哈希联接;磁盘上的哈希联接可以使用的磁盘文件数受限制open_files_limit。从MySQL 8.0.19开始,MySQL 8.0.18中
hash_join引入的优化器开关不再起作用。这也适用于HASH_JOIN和NO_HASH_JOIN优化器提示。开关和提示现在都已弃用,并将在将来的MySQL版本中删除。在MySQL 8.0.20中,即使在查询不包含等联接条件的情况下,只要使用块嵌套循环,都将使用哈希联接。这适用于内部非等联接,半联接,反联接,左外部联接和右外部联接。此外,内部联接和外部联接(包括半联接和反联接)现在都可以使用批处理密钥访问(BKA),该批处理密钥访问会增量分配联接缓冲内存,这样单个查询就不需要消耗解析所需的大量资源。 。从MySQL 8.0.18开始,仅支持内部联接的BKA。
MySQL 8.0.20还用迭代器执行器替换了以前版本的MySQL中使用的执行器。这项工作包括为那些尚未优化为半联接的查询替换管理该格式查询的旧索引子查询引擎,以及以以前依赖于旧执行程序的相同形式实现的查询。
WHEREvalueIN (SELECTcolumnFROMtableWHERE ...)IN有关更多信息和示例,请参见 第8.2.1.4节“哈希联接优化”。另请参阅 批处理密钥访问联接。
-
EXPLAIN ANALYZE语句。 MySQL 8.0.18中实现了 一种新形式的
EXPLAIN语句,它以处理查询所用的每个迭代器的格式EXPLAIN ANALYZE提供了有关SELECT语句 执行的扩展信息TREE,并使得可以将估计成本与查询的实际成本进行比较。此信息包括启动成本,总成本,此迭代器返回的行数以及执行的循环数。在MySQL 8.0.20和更高版本中,该语句还支持
FORMAT=TREE说明符。TREE是唯一受支持的格式。有关更多信息,请参见使用EXPLAIN ANALYZE获取信息。
-
查询演员表注入。 在8.0.18及更高版本中,MySQL现在将表达式操作和条件数据与预期的数据类型不匹配的表达式和条件内的转换操作注入查询项树中。这对查询结果或执行速度没有影响,但是使查询的执行等同于符合SQL标准的查询,同时保持了与MySQL早期版本的向后兼容性。
现在这样的隐式转换的时间类型(之间执行
DATE,DATETIME,TIMESTAMP,TIME)和数字类型(SMALLINT,TINYINT,MEDIUMINT,INT/INTEGER,BIGINT;DECIMAL/NUMERIC;FLOAT,DOUBLE,REAL,BIT),只要他们正在使用任何标准的数字比较运算符(相较=,>=,>,<,<=,<>/!=,要么<=>)。在这种情况下,任何尚未为a的值DOUBLE都将强制转换为1。现在也执行强制转换注入,以比较DATE或TIME值与DATETIME值,其中,在必要时将参数强制转换 为DATETIME。因此能够看到通过查看的输出时石膏注入到一个给定的查询
EXPLAIN ANALYZE,EXPLAIN FORMAT=JSON或者,如下所示,EXPLAIN FORMAT=TREE:mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME); Query OK, 0 rows affected (0.62 sec) mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL); Query OK, 0 rows affected (0.51 sec) mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G *************************** 1. row *************************** EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double)) (cost=0.70 rows=1) -> Table scan on n (cost=0.35 rows=1) -> Hash -> Table scan on d (cost=0.35 rows=1)也可以通过执行看到这种强制类型转换
EXPLAIN [FORMAT=TRADITIONAL],在这种情况下,也有必要SHOW WARNINGS事后发布。 -
TIMESTAMP和DATETIME的时区支持。 从MySQL 8.0.19开始,服务器接受带有插入的datetime(
TIMESTAMP和DATETIME)值的时区偏移量。该偏移量使用与设置time_zone系统变量时使用的格式相同的格式,不同之处在于,当偏移量的小时部分小于10且'-00:00'不允许时,前导零是必需的 。日期时间文字,其中包括时区偏移的例子是'2019-12-11 10:40:30-05:00','2003-04-14 03:30:00+10:00'和'2020-01-01 15:35:45+05:30'。选择日期时间值时不显示时区偏移量。
包含时区偏移量的Datetime文字可用作准备好的语句参数值。
作为该工作的一部分,用于设置的值
time_zone系统变量现在也限制在范围-14:00到+14:00,包括端值。(它仍然可以分配名称值以time_zone诸如'EST','Posix/Australia/Brisbane'和'Europe/Stockholm'该变量,条件是MySQL的时区表被加载;另见 填充的时区表)。有关更多信息和示例,请参见 第5.1.14节“ MySQL服务器时区支持”以及 第11.2.2节“ DATE,DATETIME和TIMESTAMP类型”。
-
有关JSON模式CHECK约束失败的精确信息。 在
JSON_SCHEMA_VALID()用于指定CHECK约束时,MySQL 8.0.19和更高版本提供有关此类约束失败原因的准确信息。有关示例和更多信息,请参见 JSON_SCHEMA_VALID()和CHECK约束。另请参见第13.1.20.6节“检查约束”。
-
行和列别名具有ON DUPLICATE KEY UPDATE。 从MySQL 8.0.19开始,可以使用别名引用要插入的行,以及(可选)引用其列。考虑在具有列 和
INSERT的表t上的以下 语句 :abINSERT INTO t SET a=9,b=5 ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);使用
new新行的别名,在某些情况下,使用别名m和n该行的列,INSERT可以用许多不同的方式重写该 语句,此处显示了一些示例:INSERT INTO t SET a=9,b=5 AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t VALUES(9,5) AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t SET a=9,b=5 AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n; INSERT INTO t VALUES(9,5) AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n;欲了解更多信息和示例,请参见 第13.2.6.2,“INSERT ... ON DUPLICATE KEY UPDATE语句”。
-
SQL标准的显式表子句和表值构造函数。 根据SQL标准添加了表值构造函数和显式表子句。这些分别在MySQL 8.0.19中作为
TABLE语句和VALUES语句实现。该
TABLE语句具有格式,并且等效于。它支持 和 子句(后者带有optional ),但不允许选择单个表列。 可以在您使用等效 语句的任何地方使用;这包括连接,联合, ,, 语句和子查询。例如:TABLEtable_nameSELECT * FROMtable_nameORDER BYLIMITOFFSETTABLESELECTINSERT ... SELECTREPLACECREATE TABLE ... SELECT-
TABLE t1 UNION TABLE t2相当于SELECT * FROM t1 UNION SELECT * FROM t2 -
CREATE TABLE t2 TABLE t1相当于CREATE TABLE t2 SELECT * FROM t1 -
SELECT a FROM t1 WHERE b > ANY (TABLE t2)等同于SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)。
VALUES可用于一个表值提供给一个INSERT,REPLACE或SELECT语句,和由的VALUES关键字随后进行了一系列行构造(的ROW())由逗号分隔。例如,该语句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)。您还可以像选择VALUES表一样从表值构造函数中进行选择 ,请记住,这样做时必须提供表别名,并像使用SELECT其他别名一样使用它 。这包括联接,联合和子查询。有关详细信息
TABLE,并VALUES和其使用的示例,请参阅本文档的以下部分: -
-
FORCE INDEX,IGNORE INDEX的优化程序提示。 MySQL 8.0引入了索引级优化器提示,这些提示与第8.9.4节“索引提示”中所述的传统索引提示类似。新的提示这里列出,与他们一起
FORCE INDEX或IGNORE INDEX等价物:-
GROUP_INDEX: 相当于FORCE INDEX FOR GROUP BYNO_GROUP_INDEX: 相当于IGNORE INDEX FOR GROUP BY -
JOIN_INDEX: 相当于FORCE INDEX FOR JOINNO_JOIN_INDEX: 相当于IGNORE INDEX FOR JOIN -
ORDER_INDEX: 相当于FORCE INDEX FOR ORDER BYNO_ORDER_INDEX: 相当于IGNORE INDEX FOR ORDER BY -
INDEX:与GROUP_INDEX加JOIN_INDEX号 相同ORDER_INDEX; 等同于FORCE INDEX没有修饰符NO_INDEX:与NO_GROUP_INDEX加NO_JOIN_INDEX号 相同NO_ORDER_INDEX; 等同于IGNORE INDEX没有修饰符
例如,以下两个查询是等效的:
SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2; SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;前面列出的优化器提示在语法和用法上与现有索引级优化器提示遵循相同的基本规则。
这些优化器提示旨在替换
FORCE INDEX和IGNORE INDEX,我们计划在将来的MySQL版本中弃用和,然后从MySQL中删除。他们没有实现的单个精确等效项USE INDEX;相反,你可以使用一个或多个NO_INDEX,NO_JOIN_INDEX,NO_GROUP_INDEX,或NO_ORDER_INDEX达到同样的效果。有关更多信息和使用示例,请参见“ 索引级优化器提示”。
-
-
JSON_VALUE()函数。 MySQL 8.0.21实现了
JSON_VALUE()旨在简化JSON列索引的新功能 。在最基本的形式中,它将JSON文档和指向该文档中单个值的JSON路径作为参数,以及(可选)允许您使用RETURNING关键字指定返回类型 。 等效于此:JSON_VALUE(json_doc,pathRETURNINGtype)CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type );您还可以指定
ON EMPTY,ON ERROR或两者的条款,类似于使用的那些JSON_TABLE()。您可以使用
JSON_VALUE()在这样的JSON列上的表达式上创建索引:CREATE TABLE t1( j JSON, INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) ) ); INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');使用此表达式的查询(如此处所示)可以使用索引:
SELECT name, price FROM t1 WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;在许多情况下,这比从该
JSON列创建一个生成的列然后在生成的列上创建索引要简单得多。有关更多信息和示例,请参见的描述
JSON_VALUE()。 -
用户评论和用户属性。 MySQL 8.0.21引入了在创建或更新用户帐户时设置用户注释和用户属性的功能。用户注释包括作为参数传递
COMMENT给与CREATE USERorALTER USER语句一起使用的子句的任意文本。用户属性由JSON对象形式的数据组成,该数据作为参数传递给与ATTRIBUTE这两个语句之一一起使用的 子句。该属性可以包含JSON对象表示法中的任何有效键值对。仅一个COMMENT或ATTRIBUTE可以在单一使用CREATE USER或ALTER USER声明。用户注释和用户属性在内部作为JSON对象存储在一起,注释文本作为元素的值
comment作为其键。可以从 表的ATTRIBUTE列中 检索此信息INFORMATION_SCHEMA.USER_ATTRIBUTES。因为它是JSON格式,所以您可以使用MySQL的JSON函数和运算符来解析其内容(请参见 第12.17节“ JSON函数”)。与使用该JSON_MERGE_PATCH()函数时一样,对用户属性的连续更改将与其当前值合并。例:
mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account'; Query OK, 0 rows affected (0.33 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}'; Query OK, 0 rows affected (0.14 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"email":"mary.smith@example.com"}'; Query OK, 0 rows affected (0.12 sec) mysql> SELECT -> USER, -> HOST, -> ATTRIBUTE->>"$.fname" AS 'First Name', -> ATTRIBUTE->>"$.lname" AS 'Last Name', -> ATTRIBUTE->>"$.email" AS 'Email', -> ATTRIBUTE->>"$.comment" AS 'Comment' -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES -> WHERE USER='mary' AND HOST='localhost'\G *************************** 1. row *************************** USER: mary HOST: localhost First Name: Mary Last Name: Smith Email: mary.smith@example.com Comment: This is Mary Smith's account 1 row in set (0.00 sec)有关更多信息和示例,请参见 第13.7.1.3节“ CREATE USER语句”,第13.7.1.1节“ ALTER USER语句”和第25.41节“ INFORMATION_SCHEMA USER_ATTRIBUTES表”。
-
optimizer_switch preferred_ordering_index标志。 默认情况下,MySQL总是尝试对具有 子句的任何查询
ORDER BY或GROUP BY查询使用有序索引LIMIT(reconsidering_access_paths_for_index_ordering优化)。由于在某些情况下为此类查询选择不同的优化实际上可能会更好地执行,因此从MySQL 8.0.21开始,可以通过将optimizer_switch系统变量的prefer_ordering_index标志设置为来禁用此优化off。有关更多信息,请参见 第8.9.2节“可切换优化”和 第8.2.1.19节“ LIMIT查询优化”。
以下功能在MySQL 8.0中已弃用,并且在以后的系列中可能会或将被删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用在更高版本的MySQL系列中已删除的MySQL 8.0中不推荐使用的功能的应用程序,将语句从MySQL 8.0主服务器复制到更高系列的从服务器时,语句可能会失败,或对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用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安装应过渡到使用组件。请参见 第6.4.3.3节“过渡到密码验证组件”。 -
和 语句 的
ENGINE子句 已弃用。ALTER TABLESPACEDROP TABLESPACE -
在
PAD_CHAR_TO_FULL_LENGTHSQL模式已经过时了。 -
AUTO_INCREMENT不支持类型FLOAT和DOUBLE(以及任何同义词)的列。考虑AUTO_INCREMENT从此类列中删除属性,或将其转换为整数类型。 -
的
UNSIGNED属性被弃用类型的列FLOAT,DOUBLE和DECIMAL(和任何同义词)。考虑CHECK对此类列使用简单约束。 -
FLOAT(和 语法指定的位数类型的列的数目 和 (和任何同义词)是一个非标准MySQL扩展。不建议使用此语法。M,D)DOUBLE(M,D)FLOATDOUBLE -
ZEROFILL对于数字数据类型,不建议使用 该属性,对于整数数据类型,则不建议使用显示宽度属性。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用该LPAD()功能对数字进行零填充以达到所需的宽度,或者可以将格式化的数字存储在CHAR列中。 -
对于字符串数据类型,该
BINARY属性是非标准的MySQL扩展,它是用于指定_bin列字符集(如果未指定列字符集,则为表默认字符集)的二进制()归类的简写形式。在MySQL 8.0中,这种非标准用法BINARY是不明确的,因为utf8mb4字符集具有多个_bin排序规则,因此BINARY不赞成使用该属性,并且在将来的MySQL版本中将删除对该 属性的支持。应将应用程序调整为使用显式_bin排序规则。BINARY用于指定数据类型或字符集 的用法保持不变。 -
非标准C风格
&&,||和!运营商认为是标准的SQL同义词AND,OR和NOT运营商,分别已被取消。使用非标准运算符的应用程序应调整为使用标准运算符。注意使用的
||,除非被弃用PIPES_AS_CONCAT启用SQL模式。在这种情况下,||表示SQL标准字符串连接运算符。 -
该
JSON_MERGE()功能已弃用。使用JSON_MERGE_PRESERVE()代替。 -
不建议使用
SQL_CALC_FOUND_ROWS查询修饰符和附带FOUND_ROWS()函数。有关FOUND_ROWS()替代策略的信息,请参见 说明。 -
从MySQL 8.0.13开始,不 支持
TABLESPACE = innodb_file_per_tableandTABLESPACE = innodb_temporary子句CREATE TEMPORARY TABLE。 -
对于
SELECT语句,自MySQL 8.0.20起,不建议在末尾使用INTO子句,FROM但不要在末尾SELECT使用子句。最好将放在INTO语句的末尾。对于
UNION语句,INTO从MySQL 8.0.20开始不推荐使用这两个包含的变体:-
在查询表达式的结尾查询块中,使用
INTObeforeFROM。 -
在查询表达式的带括号的尾随块中,请使用
INTO,而不管其相对于的位置FROM。
请参见第13.2.10.1节“ SELECT ... INTO语句”和 第13.2.10.3节“ UNION子句”。
-
-
该mysql_upgrade客户端已被弃用,因为它的功能升级的系统表
mysql系统架构和对象在其他模式已移动到MySQL服务器。请参见 第2.11.3节“ MySQL升级过程将升级什么”。 -
该
--no-dd-upgrade服务器选项已被弃用。它被--upgrade选件取代,该 选件可以更好地控制数据字典和服务器升级行为。 -
该
mysql_upgrade_info文件(已创建数据目录并用于存储MySQL版本号)已被弃用,并将在以后的MySQL版本中删除。 -
不建议使用
relay_log_info_file系统变量和--master-info-file选项。以前,这些被用来当指定中继日志信息记录和掌握信息日志的名称relay_log_info_repository=FILE,并master_info_repository=FILE分别设置,但这些设置已被弃用。碰撞日志从属表已取代了用于中继日志信息日志和主信息日志的文件,这是MySQL 8.0中的默认设置。 -
该
max_length_for_sort_data系统变量现在已经过时,由于优化的变化,使其过时的没有效果,。 -
不建议使用这些旧参数来压缩与服务器的连接:
--compress客户端命令行选项;C API函数的MYSQL_OPT_COMPRESS选项mysql_options();该slave_compressed_protocol系统变量。有关替代使用的参数的信息,请参见 第4.2.6节“连接压缩控制”。 -
不建议使用
MYSQL_PWD环境变量来指定MySQL密码。 -
从MySQL 8.0.20开始,不赞成 使用
VALUES()来访问中的新行值INSERT ... ON DUPLICATE KEY UPDATE。请为新的行和列使用别名。 -
因为
ON ERROR在ON EMPTY调用时指定before 违反JSON_TABLE()了SQL标准,所以现在在MySQL中不推荐使用此语法。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印警告。在单个JSON_TABLE()调用中指定这两个子句时,请确保ON EMPTY首先使用该子句。
以下各项已过时,并且已在MySQL 8.0中删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用在MySQL 8.0中删除的功能的MySQL 5.7应用程序,将语句从MySQL 5.7主服务器复制到MySQL 8.0从服务器时,语句可能会失败,或对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用MySQL 8.0中已删除功能的应用程序以避免这些问题,并在可能的情况下使用替代方法。
-
在
innodb_locks_unsafe_for_binlog除去系统变量。该READ COMMITTED隔离级别提供了类似的功能。 -
information_schema_statsMySQL 8.0.0中引入 的变量已删除,并information_schema_stats_expiry在MySQL 8.0.3中被替换 。information_schema_stats_expiry定义缓存INFORMATION_SCHEMA表统计信息的到期设置 。有关更多信息,请参见 第8.2.3节“优化INFORMATION_SCHEMA查询”。 -
与已过时的
InnoDB系统表相关的代码已在MySQL 8.0.3中删除。INFORMATION_SCHEMA基于InnoDB系统表的视图被数据字典表上的内部系统视图替换。受影响的InnoDBINFORMATION_SCHEMA视图已重命名:表1.1重命名的InnoDB信息架构视图
旧名称 新名字 INNODB_SYS_COLUMNSINNODB_COLUMNSINNODB_SYS_DATAFILESINNODB_DATAFILESINNODB_SYS_FIELDSINNODB_FIELDSINNODB_SYS_FOREIGNINNODB_FOREIGNINNODB_SYS_FOREIGN_COLSINNODB_FOREIGN_COLSINNODB_SYS_INDEXESINNODB_INDEXESINNODB_SYS_TABLESINNODB_TABLESINNODB_SYS_TABLESPACESINNODB_TABLESPACESINNODB_SYS_TABLESTATSINNODB_TABLESTATSINNODB_SYS_VIRTUALINNODB_VIRTUAL
升级到MySQL 8.0.3或更高版本后,请更新所有引用先前
InnoDBINFORMATION_SCHEMA视图名称的脚本。 -
与帐户管理相关的以下功能已删除:
-
使用
GRANT创建用户。而是使用CREATE USER。遵循这种做法会使NO_AUTO_CREATE_USERSQL模式对GRANT语句不重要,因此也将其删除,并且当sql_mode选项文件中选项的该值的存在阻止mysqld启动时,现在会将错误写入服务器日志。 -
使用
GRANT修改不是权限指派其他帐户属性。这包括身份验证,SSL和资源限制属性。而是在创建帐户时使用CREATE USER或在之后使用修改这些 属性ALTER USER。 -
IDENTIFIED BY PASSWORD 'auth_string'CREATE USER和的 语法GRANT。而是使用 for 和 ,其中 值的格式与命名插件兼容。IDENTIFIED WITHauth_pluginAS 'auth_string'CREATE USERALTER USER'auth_string'此外,由于
IDENTIFIED BY PASSWORD删除了语法,因此log_builtin_as_identified_by_password系统变量是多余的,并且已删除。 -
该
PASSWORD()功能。此外,PASSWORD()删除意味着 语法不再可用。SET PASSWORD ... = PASSWORD('auth_string') -
该
old_passwords系统变量。
-
-
查询缓存已删除。删除包括以下项目:
-
该
FLUSH QUERY CACHE和RESET QUERY CACHE语句。 -
这些系统变量:
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。 -
这些线程状态:
checking privileges on cached query,checking query cache for query,invalidating query cache entries,sending cached result to client,storing result in query cache,Waiting for query cache lock。 -
该
SQL_CACHESELECT修改。
这些不赞成使用的查询缓存项仍然不赞成使用,但没有效果,将在以后的MySQL版本中删除:
-
SQL_NO_CACHESELECT修饰符。 -
该
ndb_cache_check_time系统变量。
该
have_query_cache系统变量保持过时,总有一个价值NO,并会在将来的MySQL版本中删除。 -
-
数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称以查找数据库。因此,
--ignore-db-dir选项和ignore_db_dirs系统变量是多余的并被删除。 -
DDL日志(也称为元数据日志)已被删除。从MySQL 8.0.3开始,此功能由数据字典
innodb_ddl_log表处理 。请参阅 查看DDL日志。 -
该
tx_isolation和tx_read_only系统变量已被删除。使用transaction_isolation和transaction_read_only代替。 -
该
sync_frm系统变量已被删除,因为.frm文件已经过时。 -
该
secure_auth系统变量和--secure-auth客户端选项已被删除。C API函数的MYSQL_SECURE_AUTH选项mysql_options()已删除。 -
的
multi_range_count系统变量被移除。 -
该
log_warnings系统变量和--log-warnings服务器选项已被删除。请改用log_error_verbosity系统变量。 -
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,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。它们不能再分配给sql_mode系统变量或用作mysqldump--compatible选项的允许值 。删除
MAXDB意味着将或 的TIMESTAMP数据类型 视为 ,而不再视为。CREATE TABLEALTER TABLETIMESTAMPDATETIME -
子句 的不推荐使用
ASC或DESC限定符将GROUP BY被删除。先前依赖于GROUP BY排序的查询所产生的结果可能与以前的MySQL版本不同。要产生给定的排序顺序,请提供一个ORDER BY子句。 -
该语句的
EXTENDED和PARTITIONS关键字EXPLAIN已删除。这些关键字是不必要的,因为它们的效果始终处于启用状态。 -
这些与加密有关的项目已删除:
-
该
ENCODE()和DECODE()功能。 -
该
ENCRYPT()功能。 -
的
DES_ENCRYPT(),和DES_DECRYPT()功能的--des-key-file选项,have_crypt系统变量,则DES_KEY_FILE该选项FLUSH语句和HAVE_CRYPTCMake的 选项。
代替删除的加密功能:对于
ENCRYPT(),请考虑SHA2()改为使用 单向哈希。对于其他,请考虑使用AES_ENCRYPT()和AES_DECRYPT()代替。 -
-
在MySQL 5.7中,不建议使用多个名称下的多个空间函数,以便朝着使空间函数名称空间更一致的方向移动,其目标是每个空间函数名称
ST_以其执行精确操作或以MBR执行一个基于最小边界矩形的操作。在MySQL 8.0中,不赞成使用的函数被删除,仅留下相应的ST_和MBR函数:-
这些功能有利于去除
MBR名称:Contains(),Disjoint(),Equals(),Intersects(),Overlaps(),Within()。 -
这些功能有利于去除
ST_名称:Area(),AsBinary(),AsText(),AsWKB(),AsWKT(),Buffer(),Centroid(),ConvexHull(),Crosses(),Dimension(),Distance(),EndPoint(),Envelope(),ExteriorRing(),GeomCollFromText(),GeomCollFromWKB(),GeomFromText(),GeomFromWKB(),GeometryCollectionFromText(),GeometryCollectionFromWKB(),GeometryFromText(),GeometryFromWKB(),GeometryN(),GeometryType(),InteriorRingN(),IsClosed(),IsEmpty(),IsSimple(),LineFromText(),LineFromWKB(),LineStringFromText(),LineStringFromWKB(),MLineFromText(),MLineFromWKB(),MPointFromText(),MPointFromWKB(),MPolyFromText(),MPolyFromWKB(),MultiLineStringFromText(),MultiLineStringFromWKB(),MultiPointFromText(),MultiPointFromWKB(),MultiPolygonFromText(),MultiPolygonFromWKB(),NumGeometries(),NumInteriorRings(),NumPoints(),PointFromText(),PointFromWKB(),PointN(),PolyFromText(),PolyFromWKB(),PolygonFromText(),PolygonFromWKB(),SRID(),StartPoint(),Touches(),X(),Y()。 -
GLength()被取消赞成ST_Length()。
-
-
第12.16.4节“从WKB值创建几何值 的函数”中描述的函数 以前接受WKB字符串或几何参数。几何参数不再被允许并产生错误。有关从不使用几何参数迁移查询的准则,请参见该部分。
-
解析器不再视为SQL语句中
\N的同义词NULL。使用NULL代替。这种变化不影响文本文件导入和导出操作与执行
LOAD DATA或SELECT ... INTO OUTFILE用于其NULL继续受到代表\N。请参见 第13.2.7节“ LOAD DATA语句”。 -
PROCEDURE ANALYSE()语法已删除。 -
客户端
--ssl和--ssl-verify-server-cert选项已被删除。使用--ssl-mode=REQUIRED代替--ssl=1或--enable-ssl。使用--ssl-mode=DISABLED替代--ssl=0,--skip-ssl或--disable-ssl。使用--ssl-mode=VERIFY_IDENTITY代替--ssl-verify-server-cert选项。(服务器端--ssl选项保持不变。)对于C API,
MYSQL_OPT_SSL_ENFORCE和的MYSQL_OPT_SSL_VERIFY_SERVER_CERT选项mysql_options()对应于客户端--ssl和--ssl-verify-server-cert选项,并被删除。使用MYSQL_OPT_SSL_MODE选项值SSL_MODE_REQUIRED或SSL_MODE_VERIFY_IDENTITY代替。 -
该
--temp-pool移除服务器选项。 -
的
ignore_builtin_innodb系统变量被移除。 -
服务器不再通过添加
#mysql50#前缀将包含特殊字符的MySQL 5.1之前的数据库名称转换为5.1格式。由于不再执行这些转换,因此删除了mysqlcheck的--fix-db-names和--fix-table-names选项, 语句的UPGRADE DATA DIRECTORY NAME子句ALTER DATABASE以及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分发中删除。数据目录初始化应通过使用 或 选项调用mysqld来执行 。另外,删除了mysql_install_db使用的 mysqld 选项,并删除 了控制mysql_install_db安装位置的 选项。
--initialize--initialize-insecure--bootstrapINSTALL_SCRIPTDIRCMake -
通用分区处理程序已从MySQL服务器中删除。为了支持给定表的分区,用于该表的存储引擎现在必须提供其自己的(“ 本机 ”)分区处理程序。在
--partition和--skip-partition选项从MySQL服务器删除,分区相关条目中的输出不再显示SHOW PLUGINS或在INFORMATION_SCHEMA.PLUGINS表中。当前有两个MySQL存储引擎提供本机分区支持:
InnoDB和NDB。其中,InnoDBMySQL 8.0 仅 支持。使用任何其他存储引擎在MySQL 8.0中创建分区表的任何尝试都会失败。升级的后果。 不支持 使用除
InnoDB(例如MyISAM)以外的存储引擎将分区表从MySQL 5.7(或更早版本)直接升级到MySQL 8.0。处理此类表有两种选择:-
使用删除表的分区
ALTER TABLE ... REMOVE PARTITIONING。 -
更改用于表的存储引擎
InnoDB,用ALTER TABLE ... ENGINE=INNODB。
在
InnoDB将服务器升级到MySQL 8.0之前,必须对每个分区的非表至少执行上述两个操作之一。否则,升级后将无法使用该表。由于使用存储引擎在没有分区支持的情况下会导致创建分区表的表创建语句现在由于错误而失败(ER_CHECK_NOT_IMPLEMENTED),因此必须确保转储文件中的任何语句(例如mysqldump编写的语句)从您希望导入到创建分区表的MySQL 8.0服务器的MySQL的较早版本开始,也没有指定
MyISAM没有本地分区处理程序的存储引擎 。您可以通过执行以下任一操作来实现:-
从
CREATE TABLE对STORAGE ENGINE选项使用非值的语句中删除对分区的所有引用InnoDB。 -
将存储引擎指定为
InnoDB,或者InnoDB默认情况下允许 用作表的存储引擎。
有关更多信息,请参见 第23.6.2节“与存储引擎有关的分区限制”。
-
-
系统和状态变量信息不再保存在中
INFORMATION_SCHEMA。这些表被删除:GLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUS。请改用相应的性能架构表。请参见 第26.12.14节“性能模式系统变量表”和 第26.12.15节“性能模式状态变量表”。另外,show_compatibility_56系统变量也被删除。它用于过渡期间,在此期间,系统和状态变量信息INFORMATION_SCHEMA表已移至Performance Schema表,并且不再需要。这些状态变量被删除:Slave_heartbeat_period,Slave_last_heartbeat,Slave_received_heartbeats,Slave_retried_transactions,Slave_running。性能架构表中提供了它们提供的信息。请参阅 迁移到性能模式系统和状态变量表。 -
性能模式
setup_timers表已删除,表中的TICK行 也已删除performance_timers。 -
该
libmysqld嵌入式服务器库被删除,连同:-
在, , ,和 选项
mysql_options()MYSQL_OPT_GUESS_CONNECTIONMYSQL_OPT_USE_EMBEDDED_CONNECTIONMYSQL_OPT_USE_REMOTE_CONNECTIONMYSQL_SET_CLIENT_IP -
该mysql_config
--libmysqld-libs,--embedded-libs和--embedded选项 -
该CMake的
WITH_EMBEDDED_SERVER,WITH_EMBEDDED_SHARED_LIBRARY和INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项 -
(未记录)mysql
--server-arg选项 -
该mysqltest
--embedded-server,--server-arg和--server-file选项 -
该mysqltest_embedded和 mysql_client_test_embedded测试程序
-
-
该mysql_plugin移除工具。替代方法包括在服务器启动时使用
--plugin-load或--plugin-load-add选项或在运行时使用该INSTALL PLUGIN语句加载插件。 -
该的resolveip工具被删除。 可以改用nslookup,host或 dig。
-
该resolve_stack_dump工具被删除。官方MySQL构建中的堆栈跟踪始终是符号化的,因此无需使用 resolve_stack_dump。
-
以下服务器错误代码未使用且已删除。专门测试其中任何一个错误的应用程序都应该更新。
ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE ER_BINLOG_ROW_RBR_TO_SBR ER_BINLOG_ROW_WRONG_TABLE_DEF ER_CANT_ACTIVATE_LOG ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION ER_CANT_CREATE_FEDERATED_TABLE ER_CANT_CREATE_SROUTINE ER_CANT_DELETE_FILE ER_CANT_GET_WD ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF ER_CANT_SET_WD ER_CANT_WRITE_LOCK_LOG_TABLE ER_CREATE_DB_WITH_READ_LOCK ER_CYCLIC_REFERENCE ER_DB_DROP_DELETE ER_DELAYED_NOT_SUPPORTED ER_DIFF_GROUPS_PROC ER_DISK_FULL ER_DROP_DB_WITH_READ_LOCK ER_DROP_USER ER_DUMP_NOT_IMPLEMENTED ER_ERROR_DURING_CHECKPOINT ER_ERROR_ON_CLOSE ER_EVENTS_DB_ERROR ER_EVENT_CANNOT_DELETE ER_EVENT_CANT_ALTER ER_EVENT_COMPILE_ERROR ER_EVENT_DATA_TOO_LONG ER_EVENT_DROP_FAILED ER_EVENT_MODIFY_QUEUE_ERROR ER_EVENT_NEITHER_M_EXPR_NOR_M_AT ER_EVENT_OPEN_TABLE_FAILED ER_EVENT_STORE_FAILED ER_EXEC_STMT_WITH_OPEN_CURSOR ER_FAILED_ROUTINE_BREAK_BINLOG ER_FLUSH_MASTER_BINLOG_CLOSED ER_FORM_NOT_FOUND ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED ER_FRM_UNKNOWN_TYPE ER_GOT_SIGNAL ER_GRANT_PLUGIN_USER_EXISTS ER_GTID_MODE_REQUIRES_BINLOG ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST ER_HASHCHK ER_INDEX_REBUILD ER_INNODB_NO_FT_USES_PARSER ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR ER_LOAD_DATA_INVALID_COLUMN_UNUSED ER_LOGGING_PROHIBIT_CHANGING_OF ER_MALFORMED_DEFINER ER_MASTER_KEY_ROTATION_ERROR_BY_SE ER_NDB_CANT_SWITCH_BINLOG_FORMAT ER_NEVER_USED ER_NISAMCHK ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR ER_NO_FILE_MAPPING ER_NO_GROUP_FOR_PROC ER_NO_RAID_COMPILED ER_NO_SUCH_KEY_VALUE ER_NO_SUCH_PARTITION__UNUSED ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED ER_ORDER_WITH_PROC ER_PARTITION_SUBPARTITION_ERROR ER_PARTITION_SUBPART_MIX_ERROR ER_PART_STATE_ERROR ER_PASSWD_LENGTH ER_QUERY_ON_MASTER ER_RBR_NOT_AVAILABLE ER_SKIPPING_LOGGED_TRANSACTION ER_SLAVE_CHANNEL_DELETE ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT ER_SLAVE_MUST_STOP ER_SLAVE_WAS_NOT_RUNNING ER_SLAVE_WAS_RUNNING ER_SP_GOTO_IN_HNDLR ER_SP_PROC_TABLE_CORRUPT ER_SQL_MODE_NO_EFFECT ER_SR_INVALID_CREATION_CTX ER_TABLE_NEEDS_UPG_PART ER_TOO_MUCH_AUTO_TIMESTAMP_COLS ER_UNEXPECTED_EOF ER_UNION_TABLES_IN_DIFFERENT_DIR ER_UNSUPPORTED_BY_REPLICATION_THREAD ER_UNUSED1 ER_UNUSED2 ER_UNUSED3 ER_UNUSED4 ER_UNUSED5 ER_UNUSED6 ER_VIEW_SELECT_DERIVED_UNUSED ER_WRONG_MAGIC ER_WSAS_FAILED -
不推荐使用
INFORMATION_SCHEMAINNODB_LOCKS,并INNODB_LOCK_WAITS表将被删除。请改用性能架构data_locks和data_lock_waits表。注意在MySQL 5.7中,
LOCK_TABLE在列INNODB_LOCKS表和locked_table在列sys模式innodb_lock_waits和x$innodb_lock_waits视图包含组合模式/表名的值。在MySQL 8.0中,data_locks表和sys架构视图包含单独的架构名称和表名称列。请参见 第27.4.3.9节“ innodb_lock_waits和x $ innodb_lock_waits视图”。 -
InnoDB不再支持压缩的临时表。当innodb_strict_mode启用(默认值),CREATE TEMPORARY TABLE如果返回错误ROW_FORMAT=COMPRESSED或KEY_BLOCK_SIZE指定的。如果innodb_strict_mode禁用此选项,则会发出警告,并使用非压缩的行格式创建临时表。 -
InnoDB在MySQL数据目录之外创建表空间数据文件时,不再创建.isl文件(InnoDB符号链接文件)。innodb_directories现在,该 选件支持查找在数据目录外部创建的表空间文件。通过此更改,
.isl不再支持在服务器脱机时通过手动修改文件来移动远程表空间 。该innodb_directories选项现在支持移动远程表空间文件 。请参见第15.6.3.6节“在服务器脱机时移动表空间文件”。 -
以下
InnoDB文件格式变量已删除:文件格式变量对于创建与
InnoDBMySQL 5.1 早期版本兼容的表是必需的 。现在,MySQL 5.1的产品生命周期已经结束,不再需要这些选项。该
FILE_FORMAT列已从INNODB_TABLES和INNODB_TABLESPACES信息模式表中删除。 -
innodb_support_xa删除了支持XA事务中两阶段提交 的系统变量。InnoDB始终启用对XA事务中的两阶段提交的支持。 -
对DTrace的支持已删除。
-
该
JSON_APPEND()功能已删除。使用JSON_ARRAY_APPEND()代替。 -
InnoDBMySQL 8.0.13中删除了 对将表分区放置在共享 表空间中的支持。共享表空间包括InnoDB系统表空间和常规表空间。有关在共享表空间中标识分区并将其移至每个表文件表空间的信息,请参见第2.11.5节“为升级准备安装”。 -
支持
SET在MySQL 8.0.13中弃用的语句中设置用户变量 。此功能可能会在MySQL 9.0中删除。 -
该
--ndbPERROR移除选项。请改用ndb_perror实用程序。 -
该
innodb_undo_logs变量已删除。该innodb_rollback_segments变量执行相同的功能,应该代替。 -
在
Innodb_available_undo_logs取出状态变量。每个表空间可用的回滚段数可以使用SHOW VARIABLES LIKE 'innodb_rollback_segments'; -
从MySQL 8.0.14开始,先前弃用的
innodb_undo_tablespaces变量不再可配置。有关更多信息,请参见第15.6.3.4节“撤消表空间”。 -
对
ALTER TABLE ... UPGRADE PARTITIONING语句的支持已删除。 -
从MySQL 8.0.16开始,
internal_tmp_disk_storage_engine已经删除了对系统变量的支持 。现在,磁盘上的内部临时表始终使用InnoDB存储引擎。有关更多信息,请参阅 磁盘内部临时表的存储引擎。 -
该CMake的选择是不使用的,并已被删除。
DISABLE_SHARED
1.4 MySQL 8.0的新增功能
本节总结了已添加到MySQL 8.0中,已弃用和从MySQL 8.0中删除的内容。随附的部分列出了在MySQL 8.0中已添加,不建议使用或删除的MySQL服务器选项和变量。请参见 第1.5节“在MySQL 8.0中添加,不建议使用或删除的服务器和状态变量及选项”。
以下功能已添加到MySQL 8.0:
-
数据字典。 MySQL现在合并了一个事务性数据字典,用于存储有关数据库对象的信息。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。有关更多信息,请参见第14章,MySQL数据字典。
-
原子数据定义语句(Atomic DDL)。 原子DDL语句将数据字典更新,存储引擎操作和与DDL操作相关联的二进制日志写入操作组合到单个原子事务中。有关更多信息,请参见 第13.1.1节“原子数据定义语句支持”。
-
升级程序。 以前,在安装新版本的MySQL之后,MySQL服务器会在下次启动时自动升级数据字典表,此后,DBA 应该 手动调用mysql_upgrade来升级
mysql模式中的系统表 以及其他模式中的对象。架构,例如sys架构和用户架构。从MySQL 8.0.16开始,服务器执行以前由mysql_upgrade处理的任务。在安装新的MySQL版本之后,服务器现在将在下次启动时自动执行所有必要的升级任务,而不依赖于DBA调用 mysql_upgrade。另外,服务器会更新帮助表的内容( mysql_upgrade并未执行此操作)。新的
--upgrade服务器选项可控制服务器如何执行自动数据字典和服务器升级操作。有关更多信息,请参见 第2.11.3节“ MySQL升级过程将升级什么”。 -
安全性和帐户管理。 添加了这些增强功能,以提高安全性并在帐户管理中提供更大的DBA灵活性:
-
mysql现在 ,系统数据库中的授权表是InnoDB(事务性)表。以前,这些是MyISAM(非事务性)表。授予表存储引擎的更改是帐户管理对帐单行为的伴随更改的基础。以前,帐户管理对帐单(例如CREATE USER或DROP USER),命名多个用户可以对某些用户成功,而对其他用户则失败。现在,每个语句都是事务性的,并且对于所有命名的用户都成功,或者回滚,并且在发生任何错误时都不起作用。如果成功,则将语句写入二进制日志;如果失败,则不写入语句。在这种情况下,将发生回滚并且不进行任何更改。有关更多信息,请参见第13.1.1节“原子数据定义语句支持”。 -
一个新的
caching_sha2_password身份验证插件可用。像sha256_password插件一样 ,caching_sha2_password实现SHA-256密码哈希,但是使用缓存来解决连接时的延迟问题。它还支持更多的连接协议,并且不需要针对基于RSA密钥对的密码交换功能而针对OpenSSL进行链接。请参见 第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。有关此默认插件更改对服务器操作以及服务器与客户端和连接器的兼容性的影响的信息,请参阅 caching_sha2_password作为首选身份验证插件。 -
MySQL现在支持角色,这些角色被称为特权集合。可以创建和删除角色。角色可以具有授予和撤销的特权。可以向用户帐户授予角色或从用户帐户撤消角色。可以从授予该帐户的角色中选择该帐户的活动适用角色,并且可以在该帐户的会话期间进行更改。有关更多信息,请参见第6.2.10节“使用角色”。
-
MySQL现在合并了用户帐户类别的概念,根据系统用户和普通用户是否具有
SYSTEM_USER特权来区分它们 。请参见第6.2.11节“帐户类别”。 -
以前,除了某些模式之外,不可能授予全局适用的特权。现在,如果
partial_revokes启用了 系统变量,则可以这样做。请参见 第6.2.12节“使用部分撤销的权限限制”。 -
该
GRANT语句有一个子句,用于指定有关用于语句执行的特权上下文的其他信息。该语法在SQL级别上可见,尽管其主要目的是通过使这些限制出现在二进制日志中,从而在跨部分撤销的授予者特权限制的所有节点上实现统一复制。请参见 第13.7.1.6节“ GRANT语句”。ASuser[WITH ROLE] -
MySQL现在维护有关密码历史记录的信息,从而限制了对先前密码的重用。DBA可能要求在一定数量的密码更改或一段时间内,不要从以前的密码中选择新密码。可以在全局范围内以及每个帐户基础上建立密码重用策略。
现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使DBA可以防止用户在不证明他们知道当前密码的情况下更改密码。可以在全局范围内以及每个帐户基础上建立密码验证策略。
现在允许帐户具有双重密码,这使得在复杂的多服务器系统中无缝执行阶段性密码更改而无需停机。
MySQL现在使管理员能够配置用户帐户,以使由于密码错误而导致的连续登录失败过多,从而导致临时帐户锁定。所需的失败次数和锁定时间可以每个帐户配置。
这些新功能使DBA可以更全面地控制密码管理。有关更多信息,请参见第6.2.15节“密码管理”。
-
如果使用OpenSSL进行编译,MySQL现在支持FIPS模式,并且在运行时可以使用OpenSSL库和FIPS对象模块。FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。请参见第6.5节“ FIPS支持”。
-
服务器用于新连接的TLS上下文现在可以在运行时重新配置。例如,此功能可能很有用,可避免重启已经运行了很长时间以至于其SSL证书已过期的MySQL服务器。请参阅 服务器端运行时配置和监视加密连接。
-
如果服务器和客户端都使用OpenSSL 1.1.1或更高版本进行编译,则OpenSSL 1.1.1支持TLS v1.3协议进行加密连接,而MySQL 8.0.16和更高版本也支持TLS v1.3。请参见 第6.3.2节“加密的连接TLS协议和密码”。
-
现在,MySQL将授予命名管道上的客户端的访问控制设置为在Windows上成功进行通信所必需的最低限度。较新的MySQL客户端软件无需任何其他配置即可打开命名管道连接。如果不能立即升级旧的客户端软件,
named_pipe_full_access_group则可以使用新的 系统变量为Windows组授予打开命名管道连接所需的权限。完全访问组的成员资格应受到限制且是临时的。
-
-
资源管理。 MySQL现在支持创建和管理资源组,并允许将服务器中运行的线程分配给特定的组,以便线程根据该组可用的资源执行。使用组属性可以控制其资源,以启用或限制组中线程的资源消耗。DBA可以根据不同的工作负载修改这些属性。当前,CPU时间是一种可管理的资源,以“ 虚拟CPU ”的概念表示这个术语包括CPU内核,超线程,硬件线程等。服务器在启动时确定有多少个虚拟CPU可用,具有适当特权的数据库管理员可以将这些CPU与资源组关联,并为组分配线程。有关更多信息,请参见 第5.1.15节“资源组”。
-
表加密管理。 现在可以通过定义和强制执行加密默认值来全局管理表加密。该
default_table_encryption变量为新创建的模式和常规表空间定义加密默认值。DEFAULT ENCRYPTION创建模式时,也可以使用子句定义模式的加密默认值。默认情况下,表继承对其创建的架构或常规表空间的加密。加密默认值通过启用table_encryption_privilege_check变量。当使用不同于设置的加密设置创建或更改模式或常规表空间default_table_encryption时,或者当使用不同于默认模式加密的加密设置创建或更改表时,将进行特权检查 。 启用该TABLE_ENCRYPTION_ADMIN特权后,将允许覆盖默认的加密设置table_encryption_privilege_check。有关更多信息,请参见 为架构和常规表空间定义加密默认值。 -
InnoDB增强功能。 这些
InnoDB增强功能已添加:-
每次值更改时,当前最大自动增量计数器值都会写入重做日志,并保存到每个检查点的引擎专用系统表中。这些更改使当前的最大自动增量计数器值在服务器重新启动后保持不变。另外:
有关更多信息,请参见 第15.6.1.6节“ InnoDB中的AUTO_INCREMENT处理”和 InnoDB AUTO_INCREMENT计数器初始化。
-
遇到索引树损坏时,
InnoDB将损坏标志写入重做日志,这会使损坏标志崩溃。InnoDB还将内存损坏标志数据写入每个检查点上的引擎专用系统表。在恢复期间,InnoDB在将内存表和索引对象标记为已损坏之前,从两个位置读取损坏标志并合并结果。 -
的
InnoDBmemcached的插件支持多个get操作(读取在一个单一的多键-值对分布式缓存 查询)和范围查询。请参见 第15.20.4节“ InnoDB memcached多重获取和范围查询支持”。 -
新的动态变量
innodb_deadlock_detect可以用于禁用死锁检测。在高并发系统上,当多个线程等待相同的锁时,死锁检测会导致速度变慢。有时,禁用死锁检测并在innodb_lock_wait_timeout发生死锁时依靠设置进行事务回滚可能会更有效 。 -
新
INFORMATION_SCHEMA.INNODB_CACHED_INDEXES表报告InnoDB每个索引在缓冲池中缓存的索引页数 。 -
InnoDB现在在共享临时表空间中创建临时表ibtmp1。 -
InnoDB支持NOWAIT和SKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。NOWAIT如果请求的行被另一个事务锁定,则导致该语句立即返回。SKIP LOCKED从结果集中删除锁定的行。请参阅 使用NOWAIT和SKIP LOCKED锁定读取并发。SELECT ... FOR SHAREreplacesSELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容。这些语句是等效的。然而,FOR UPDATE和FOR SHARE支持NOWAIT,SKIP LOCKED和选项。请参见第13.2.10节“ SELECT语句”。OFtbl_nameOF将锁定查询应用于命名表。tbl_name -
ADD PARTITION,DROP PARTITION,COALESCE PARTITION,REORGANIZE PARTITION,和REBUILD PARTITIONALTER TABLE选项由本地分区就地API的支持,可能与使用ALGORITHM={COPY|INPLACE}和LOCK条款。DROP PARTITION与一起ALGORITHM=INPLACE删除分区中存储的数据并删除分区。但是,DROP PARTITION使用ALGORITHM=COPY或old_alter_table=ON重建分区表,并尝试将数据从删除的分区移动到具有兼容PARTITION ... VALUES定义的另一个分区。无法删除的数据将被删除。 -
InnoDB现在 ,存储引擎使用MySQL数据字典,而不是其自己的特定于存储引擎的数据字典。有关数据字典的信息,请参见 第14章,MySQL数据字典。 -
mysql现在,在MySQL数据目录中InnoDB命名的单个表空间文件中 创建系统表和数据字典表mysql.ibd。以前,这些表是InnoDB在mysql数据库目录中的单个表空间文件中创建的。 -
MySQL 8.0中引入了以下撤消表空间更改:
-
默认情况下,撤消日志现在位于初始化MySQL实例时创建的两个撤消表空间中。撤消日志不再在系统表空间中创建。
-
从MySQL 8.0.14开始,可以在运行时使用
CREATE UNDO TABLESPACE语法在选定位置创建其他撤消表空间 。CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';使用
CREATE UNDO TABLESPACE语法创建的撤消表空间 可以在运行时使用DROP UNDO TABLESPACE语法删除 。DROP UNDO TABLESPACE tablespace_name;ALTER UNDO TABLESPACE语法可用于将撤消表空间标记为活动或不活动。ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};甲
STATE,显示了表空间的状态列被添加到INFORMATION_SCHEMA.INNODB_TABLESPACES表中。撤消表空间必须处于empty状态后才能删除。 -
innodb_undo_log_truncate默认情况下启用 该 变量。 -
该
innodb_rollback_segments变量定义每个撤消表空间的回滚段数。以前,innodb_rollback_segments指定了MySQL实例的回滚段总数。此更改增加了可用于并发事务的回滚段的数量。更多的回滚段会增加并发事务将单独的回滚段用于撤消日志的可能性,从而减少资源争用。
-
-
修改了影响缓冲池预刷新和刷新行为的变量的默认值:
-
现在
innodb_max_dirty_pages_pct_lwm默认值为10。先前的默认值0禁用缓冲池预刷新。当缓冲池中的脏页百分比超过10%时,值为10启用预刷新。启用预冲洗可提高性能一致性。 -
将
innodb_max_dirty_pages_pct默认值从75到90。增加InnoDB尝试刷新的数据从缓冲池,使脏页的百分比不超过这个值。增加的默认值允许缓冲池中脏页的百分比更高。
-
-
现在默认
innodb_autoinc_lock_mode设置为2(交错)。交错锁定模式允许并行执行多行插入,从而提高了并发性和可伸缩性。新的innodb_autoinc_lock_mode默认设置反映了从基于语句的复制到基于行的复制的更改,这是MySQL 5.7中的默认复制类型。基于语句的复制需要连续的自动增量锁定模式(以前的默认设置),以确保按照给定的SQL语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制对SQL语句不敏感。 SQL语句的执行顺序。有关更多信息,请参见 InnoDB AUTO_INCREMENT锁定模式。对于使用基于语句的复制的系统,新的
innodb_autoinc_lock_mode默认设置可能会破坏依赖于顺序自动增量值的应用程序。要恢复以前的默认设置,请设置innodb_autoinc_lock_mode为1。 -
ALTER TABLESPACE ... RENAME TO语法 支持重命名常规表空间 。 -
innodb_dedicated_server默认情况下禁用 的新 变量可用于InnoDB根据服务器上检测到的内存量自动配置以下选项:该选项适用于在专用服务器上运行的MySQL服务器实例。有关更多信息,请参见 第15.8.12节“为专用的MySQL服务器启用自动配置”。
-
新
INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF视图为表空间提供空间,名称,路径,标志和空间类型数据InnoDB。 -
与MySQL捆绑在一起 的zlib库版本从1.2.3版本提高到1.2.11版本。MySQL在zlib库的帮助下实现了压缩。
如果使用
InnoDB压缩表,请参见第2.11.4节“ MySQL 8.0中的更改”以了解相关的升级含义。 -
InnoDB除全局临时表空间和撤消表空间文件外 ,所有表空间文件中都存在序列化字典信息(SDI)。SDI是表和表空间对象的序列化元数据。SDI数据的存在提供了元数据冗余。例如,如果数据字典变得不可用,则可以从表空间文件中提取字典对象元数据。使用ibd2sdi工具执行SDI提取。SDI数据以JSON格式存储。在表空间文件中包含SDI数据会增加表空间文件的大小。SDI记录需要一个索引页,默认情况下大小为16KB。但是,在存储SDI数据时会对其进行压缩,以减少存储空间。
-
InnoDB现在 ,存储引擎支持原子DDL,即使服务器在操作期间停止运行,它也可以确保DDL操作完全提交或回退。有关更多信息,请参见第13.1.1节“原子数据定义语句支持”。 -
使用该
innodb_directories选项,在服务器脱机时可以将表空间文件移动或还原到新位置 。有关更多信息,请参见 第15.6.3.6节“在服务器脱机时移动表空间文件”。 -
实现了以下重做日志优化:
-
用户线程现在可以并发写入日志缓冲区,而无需同步写入。
-
用户线程现在可以按轻松的顺序将脏页添加到刷新列表中。
-
现在,专用的日志线程负责将日志缓冲区写入系统缓冲区,将系统缓冲区刷新到磁盘,通知用户线程有关已写入和已刷新的重做,维持宽松的刷新列表顺序所需的滞后时间以及写入检查点。
-
添加了系统变量,用于配置等待刷新重做的用户线程使用旋转延迟:
-
innodb_log_wait_for_flush_spin_hwm:定义最大平均日志刷新时间,超过该时间后,用户线程将在等待刷新重做时不再旋转。 -
innodb_log_spin_cpu_abs_lwm:定义最小CPU使用量,在该最小使用量之下,用户线程在等待刷新重做时不再旋转。 -
innodb_log_spin_cpu_pct_hwm:定义最大CPU使用量,在该最大CPU使用量之上,用户线程在等待刷新重做时不再旋转。
-
-
的
innodb_log_buffer_size变量是现在动态的,服务器运行时其允许调整大小日志缓冲区的。
有关更多信息,请参见 第8.5.4节“优化InnoDB重做日志”。
-
-
从MySQL 8.0.12开始,对于大对象(LOB)数据的小型更新,支持撤消日志记录,从而提高了大小为100字节或更小的LOB更新的性能。以前,LOB更新的大小至少为一个LOB页,对于可能只修改几个字节的更新而言,这不是最佳的。此增强功能基于MySQL 8.0.4中添加的对LOB数据的部分更新的支持。
-
从MySQL 8.0.12开始,
ALGORITHM=INSTANT以下ALTER TABLE操作受支持 :-
添加一列。此功能也称为 “ 即时
ADD COLUMN”。有限制条件。请参见 第15.12.1节“在线DDL操作”。 -
添加或删除虚拟列。
-
添加或删除列默认值。
-
更改索引类型。
-
重命名表。
ALGORITHM=INSTANT仅 支持的操作会 修改数据字典中的元数据。在表上没有采取任何元数据锁,并且表数据不受影响,从而使操作立即进行。如果未明确指定,ALGORITHM=INSTANT默认情况下由支持它的操作使用。如果ALGORITHM=INSTANT指定但不支持,则操作立即失败并显示错误。有关支持的操作的更多信息
ALGORITHM=INSTANT,请参见 第15.12.1节“在线DDL操作”。 -
-
从MySQL 8.0.13开始,
TempTable存储引擎支持二进制大对象(BLOB)类型列的存储。此增强功能提高了使用包含BLOB数据的临时表的查询的性能。以前,包含BLOB数据的临时表存储在定义的磁盘存储引擎中internal_tmp_disk_storage_engine。有关更多信息,请参见 第8.4.4节“ MySQL中的内部临时表使用”。 -
从MySQL 8.0.13开始,静态
InnoDB数据加密功能支持常规表空间。以前,只能加密每表文件表空间。一般的表空间支持加密,CREATE TABLESPACE和ALTER TABLESPACE语法扩展到包括ENCRYPTION条款。该
INFORMATION_SCHEMA.INNODB_TABLESPACES表现在包括一ENCRYPTION列,该列指示表空间是否已加密。在
stage/innodb/alter tablespace (encryption)加入绩效模式阶段仪器允许监测一般表的加密操作。 -
禁用该
innodb_buffer_pool_in_core_file变量可通过排除InnoDB缓冲池页面来减少核心文件的大小 。要使用此变量,core_file必须启用该变量,并且操作系统必须支持Linux 3.4及更高版本支持的的MADV_DONTDUMP非POSIX扩展madvise()。有关更多信息,请参见第15.8.3.7节“从核心文件中排除缓冲池页面”。 -
从MySQL 8.0.13开始,由用户创建的临时表和由优化程序创建的内部临时表存储在会话临时表空间中,该会话临时表空间是从临时表空间池中分配给会话的。当会话断开连接时,其临时表空间将被截断并释放回池中。在以前的版本中,临时表是在全局临时表空间(
ibtmp1)中创建的,在删除临时表后,该表不会将磁盘空间返回给操作系统。该
innodb_temp_tablespaces_dir变量定义创建会话临时表空间的位置。默认位置是#innodb_temp数据目录中的目录。该
INNODB_SESSION_TEMP_TABLESPACES表提供有关会话临时表空间的元数据。现在,全局临时表空间(
ibtmp1)存储了回滚段,用于对用户创建的临时表所做的更改。 -
从MySQL 8.0.14开始,
InnoDB支持并行聚集索引读取,这可以提高CHECK TABLE性能。此功能不适用于二级索引扫描。的innodb_parallel_read_threads并行聚簇索引读取发生会话变量必须被设置为一个大于1的值。默认值为4。用于执行并行聚集索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树的数量确定 ,以较小者为准。 -
从8.0.14开始,
innodb_dedicated_server启用该 变量后,将根据自动配置的缓冲池大小来配置日志文件的大小和数量。以前,日志文件的大小是根据在服务器上检测到的内存量来配置的,并且日志文件的数量不是自动配置的。 -
从8.0.14开始,该 语句的
ADD DATAFILE子句CREATE TABLESPACE是可选的,它允许没有FILE特权的用户 创建表空间。一个CREATE TABLESPACE没有执行的语句ADD DATAFILE子句隐式地创建一个独特的文件名的表空间的数据文件。 -
默认情况下,当TempTable存储引擎占用的内存量超过该
temptable_max_ram变量定义的内存限制时 ,TempTable存储引擎将开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始,此行为由temptable_use_mmap变量控制 。禁用temptable_use_mmap会使TempTable存储引擎将InnoDB磁盘内部临时表而不是内存映射文件用作其溢出机制。有关更多信息,请参阅 内部临时表存储引擎。 -
从MySQL 8.0.16开始,静态
InnoDB数据加密功能支持对mysql系统表空间的加密。该mysql系统表空间包含mysql系统数据库和MySQL数据字典表。有关更多信息,请参见 第15.13节“ InnoDB静态数据加密”。 -
innodb_spin_wait_pause_multiplierMySQL 8.0.16中引入 的 变量提供了对自旋锁轮询延迟持续时间的更好控制,自旋锁轮询延迟是在线程等待获取互斥量或rw锁时发生的。可以对延迟进行更精细的调整,以解决不同处理器体系结构上PAUSE指令持续时间的差异。有关更多信息,请参见 第15.8.8节“配置自旋锁定轮询”。 -
InnoDB在MySQL 8.0.17中,通过更好地利用读取线程,减少了并行扫描期间发生的预取活动的读取线程I / O来改善了大型数据集的并行读取线程性能,并支持了分区的并行扫描。并行读取线程功能由
innodb_parallel_read_threads变量控制 。现在,最大设置为256,这是所有客户端连接的线程总数。如果达到线程限制,连接将退回到使用单个线程。 -
innodb_idle_flush_pctMySQL 8.0.18中引入 的 变量允许限制空闲期间的页面刷新,这可以帮助延长固态存储设备的寿命。请参见 在空闲期间限制缓冲区刷新。 -
InnoDB从MySQL 8.0.19开始,为了生成直方图统计数据,已经 对数据进行了有效采样。请参见 直方图统计分析。 -
从MySQL 8.0.20开始,doublewrite缓冲区存储区位于doublewrite文件中。在以前的版本中,存储区位于系统表空间中。将存储区域移出系统表空间可减少写延迟,增加吞吐量并提供关于双写缓冲区页放置的灵活性。为高级双写缓冲区配置引入了以下系统变量:
-
定义双写缓冲区文件目录。
-
定义双写文件的数量。
-
定义批量写入中最大双写页数。
-
定义要批量写入的双写页面数。
有关更多信息,请参见 第15.6.4节“ Doublewrite缓冲区”。
-
-
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分析等待图表以更新交易计划权重的次数。
有关更多信息,请参见 第15.7.6节“事务调度”。
-
-
-
字符集支持。 默认字符集已从更改
latin1为utf8mb4。该utf8mb4字符集有几个新的排序规则,其中包括utf8mb4_ja_0900_as_cs,提供对Unicode在MySQL中第一个日本语言特定的排序。有关更多信息,请参见 第10.10.1节“ Unicode字符集”。 -
JSON增强。 对MySQL的JSON功能进行了以下增强或添加:
-
添加了
->>(内联路径)运算符,等效于调用JSON_UNQUOTE()的结果JSON_EXTRACT()。这是
->对MySQL 5.7中引入的列路径运算符的改进 ;col->>"$.path"等同于JSON_UNQUOTE(col->"$.path")。内联路径运算符可以用来随时随地可以使用JSON_UNQUOTE(JSON_EXTRACT()),如SELECT列清单,WHERE和HAVING条款,并ORDER BY和GROUP BY条款。有关更多信息,请参见运算符的描述以及JSON Path Syntax。 -
添加了两个JSON聚合函数
JSON_ARRAYAGG()和JSON_OBJECTAGG()。JSON_ARRAYAGG()将列或表达式作为其参数,并将结果聚合为单个JSON数组。该表达式可以求值为任何MySQL数据类型;这不一定是一个JSON值。JSON_OBJECTAGG()接受两列或表达式,将其解释为键和值;它以单个JSON对象的形式返回结果。有关更多信息和示例,请参见 第12.20节“聚合(GROUP BY)函数”。 -
添加了JSON实用程序功能
JSON_PRETTY(),该功能JSON以易于阅读的格式输出现有值;每个JSON对象成员或数组值都打印在单独的一行上,并且子对象或数组相对于其父对象要有2个空格。此函数还可以与可解析为JSON值的字符串一起使用。
有关更多详细信息和示例,请参见 第12.17.8节“ JSON实用程序函数”。
-
现在,
JSON使用来对查询中的值进行 排序时ORDER BY,每个值现在都由sort键的可变长度部分表示,而不是由固定的1K大小的一部分表示。在许多情况下,这可以减少过多的使用。例如,标量INT或什至BIGINT值实际上需要很少的字节,因此该空间的其余部分(最多90%或更多)被填充占用了。此更改具有以下性能优势:-
现在可以更有效地使用排序缓冲区空间,因此文件排序不需要像固定长度排序键那样早或经常刷新到磁盘。这意味着可以在内存中整理更多数据,避免不必要的磁盘访问。
-
比起较长的键,可以更快地比较较短的键,从而显着提高性能。对于完全在内存中执行的排序以及需要写入磁盘和从磁盘读取的排序,都是如此。
-
-
在MySQL 8.0.2中增加了对
JSON列值的部分就地更新的支持,这比完全删除现有JSON值并在其位置写入一个新的JSON效率更高,就像以前在更新任何JSON列时所做的那样 。要应用这种优化,更新,必须使用应用JSON_SET(),JSON_REPLACE()或JSON_REMOVE()。无法将新元素添加到要更新的JSON文档中;文档中的值不能占用比更新前更多的空间。请参阅 JSON值的部分更新,以详细讨论要求。可以将JSON文档的部分更新写入二进制日志,比记录完整的JSON文档占用更少的空间。在使用基于语句的复制时,始终会记录部分更新。为了使其与基于行的复制一起使用,必须首先设置
binlog_row_value_options=PARTIAL_JSON; 有关更多信息,请参见此变量的说明。 -
添加了JSON实用程序功能
JSON_STORAGE_SIZE()和JSON_STORAGE_FREE()。JSON_STORAGE_SIZE()在任何部分更新之前,返回用于JSON文档的二进制表示形式的存储空间(以字节为单位)(请参阅上一项)。JSON_STORAGE_FREE()显示JSON使用JSON_SET()或 部分更新的类型的表列中剩余的空间量JSON_REPLACE()。如果新值的二进制表示形式小于先前值的二进制表示形式,则该值大于零。这些函数中的每一个还接受JSON文档的有效字符串表示形式。对于此值,
JSON_STORAGE_SIZE()返回其二进制表示形式转换为JSON文档后使用的空间。对于包含JSON文档的字符串表示形式的变量,JSON_STORAGE_FREE()返回零。如果无法将其(非null)参数解析为有效的JSON文档,并且NULL参数为,则 任何一个函数都会产生错误NULL。有关更多信息和示例,请参见 第12.17.8节“ JSON实用程序函数”。
JSON_STORAGE_SIZE()并JSON_STORAGE_FREE()在MySQL 8.0.2中实现。 -
在MySQL 8.0.2中增加了对
$[1 to 5]XPath表达式等范围的支持 。在此版本中还增加了对last关键字和相对寻址的支持,因此$[last]始终选择数组中的最后一个(最高编号)元素以及$[last-1]最后一个相邻元素。last使用它的表达式也可以包含在范围定义中。例如,$[last-2 to last-1]返回最后两个元素,但返回数组中的一个。有关其他信息和示例,请参见 搜索和修改JSON值。 -
添加了旨在符合RFC 7396的JSON合并功能 。
JSON_MERGE_PATCH(),当用于2个JSON对象时,将它们合并为一个JSON对象,该对象具有以下集合的并集:-
第一个对象的每个成员,在第二个对象中不存在具有相同键的成员。
-
第二个对象的每个成员,在第一个对象中没有成员具有相同的键,并且其值不是JSON
null文字。 -
每个成员都具有在两个对象中都存在的键,并且其第二个对象中的值不是JSON
null文字。
作为这项工作的一部分,该
JSON_MERGE()功能已重命名JSON_MERGE_PRESERVE()。JSON_MERGE()仍然被认为是JSON_MERGE_PRESERVE()MySQL 8.0 的别名 ,但现在已弃用,并可能在将来的MySQL版本中删除。有关更多信息和示例,请参见 第12.17.4节“修改JSON值的函数”。
-
-
实现重复密钥的 “ 最后重复密钥获胜 ” 规范化,与 RFC 7159和大多数JavaScript解析器一致。此行为的示例在此处显示,其中仅
x保留具有密钥的最右边的成员:mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]', > 'x', '"abc"', 'x', '100') AS Result; +------------------------------------+ | Result | +------------------------------------+ | {"x": "100", "y": "[true, false]"} | +------------------------------------+ 1 row in set (0.00 sec)插入MySQL
JSON列中的值 也以这种方式标准化,如以下示例所示:mysql> CREATE TABLE t1 (c1 JSON); mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}'); mysql> SELECT c1 FROM t1; +------------------+ | c1 | +------------------+ | {"x": [3, 5, 7]} | +------------------+与以前的MySQL版本相比,这是一个不兼容的更改,以前的版本 在这种情况下使用了“ 首次重复键赢 ”算法。
有关更多信息和示例,请参见JSON值的规范化,合并和自动包装。
-
JSON_TABLE()在MySQL 8.0.4中 添加了该功能。此函数接受JSON数据,并将其作为具有指定列的关系表返回。此函数的语法为 ,其中 是返回JSON数据的表达式,是应用于源的JSON路径以及 列定义的列表。这里显示一个示例:
JSON_TABLE(expr,pathCOLUMNScolumn_list) [AS]alias)exprpathcolumn_listmysql> SELECT * -> FROM -> JSON_TABLE( -> '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]', -> "$[*]" COLUMNS( -> rowid FOR ORDINALITY, -> -> xa INT EXISTS PATH "$.a", -> xb INT EXISTS PATH "$.b", -> -> sa VARCHAR(100) PATH "$.a", -> sb VARCHAR(100) PATH "$.b", -> -> ja JSON PATH "$.a", -> jb JSON PATH "$.b" -> ) -> ) AS jt1; +-------+------+------+------+------+------+--------+ | rowid | xa | xb | sa | sb | ja | jb | +-------+------+------+------+------+------+--------+ | 1 | 1 | 1 | 3 | 0 | 3 | "0" | | 2 | 1 | 1 | 3 | 1 | "3" | "1" | | 3 | 1 | 1 | 2 | 1 | 2 | 1 | | 4 | 1 | 0 | 0 | NULL | 0 | NULL | | 5 | 0 | 1 | NULL | NULL | NULL | [1, 2] | +-------+------+------+------+------+------+--------+JSON源表达式可以是产生有效JSON文档的任何表达式,包括JSON文字,表列或返回JSON的函数调用,例如
JSON_EXTRACT(t1, data, '$.post.comments')。有关更多信息,请参见 第12.17.6节“ JSON表函数”。
-
-
数据类型支持。 MySQL现在支持将表达式用作数据类型规范中的默认值。这包括使用表达式作为默认值
BLOB,TEXT,GEOMETRY,和JSON数据类型,这在以前是根本不会被分配缺省值。有关详细信息,请参见第11.6节“数据类型默认值”。 -
优化器。 添加了这些优化器增强功能:
-
MySQL现在支持不可见索引。优化器根本不会使用不可见的索引,但是它通常会得到维护。默认情况下,索引可见。不可见的索引可以测试删除索引对查询性能的影响,而无需进行破坏性的更改,如果需要该索引,则必须撤消该更改。请参见 第8.3.12节“不可见索引”。
-
MySQL现在支持降序索引:
DESC索引定义不再被忽略,而是导致键值以降序存储。以前,索引可以以相反的顺序进行扫描,但会降低性能。降序索引可以按向前顺序进行扫描,这样效率更高。当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化程序可以使用多列索引。请参见第8.3.13节“降序索引”。 -
MySQL现在支持创建索引表达式值而不是列值的功能索引键部分。功能性关键部分支持对无法通过其他方式索引的值(例如
JSON值)进行索引 。有关详细信息,请参见第13.1.15节“ CREATE INDEX语句”。 -
在MySQL 8.0.14和更高版本中,
WHERE在准备过程中而不是在优化过程中删除了常量常量表达式引起的琐碎 条件。在过程的早期删除条件可以简化具有琐碎条件的外部联接的查询的联接,例如:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1现在,优化器在准备过程中会看到0 = 1始终为false,从而使其具有
OR 0 = 1冗余性,并将其删除,从而保持以下状态:SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2现在,优化器可以将查询重写为内部联接,如下所示:
SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2有关更多信息,请参见 第8.2.1.9节“外部联接优化”。
-
在MySQL 8.0.16及更高版本中,MySQL可以在优化时使用常量折叠来处理列与常量值之间的比较,其中常量超出范围或相对于列的类型在范围边界上,而不是执行因此对于执行时的每一行。例如,给定一个
t带有TINYINT UNSIGNED列的表c,优化器可以重写条件,例如WHERE c < 256toWHERE 1(并完全优化该条件)或WHERE c >= 255toWHERE c = 255。有关更多信息,请参见第8.2.1.14节“恒定折叠优化”。
-
从MySQL 8.0.16开始,与
IN子查询一起使用的半联接优化现在也可以应用于EXISTS子查询。另外,优化器现在WHERE在子查询所附加的条件下对琐碎相关的相等谓词进行解相关 ,以便可以将它们与子查询中的表达式进行类似的处理IN。这适用于EXISTS和IN子查询。有关更多信息,请参见第8.2.2.1节“使用半联接转换优化IN和EXISTS子查询谓词”。
-
在MySQL 8.0.17及更高版本中,
WHERE具有或 的条件在内部转换为反连接。(antijoin从表中返回所有与表中没有行匹配的行相匹配的行的行。)这将删除子查询,这会导致查询执行更快,因为该子查询的表现在在顶部处理水平。NOT IN (subquery)NOT EXISTS (subquery)这类似于并重用现有的
IS NULL(Not exists)外连接优化。请参阅 EXPLAIN Extra Information。
-
-
常用表表达式。 MySQL现在支持通用表表达式,包括非递归和递归的。公用表表达式允许使用命名的临时结果集,该方法通过允许在
WITH语句之前的子句SELECT和某些其他语句来实现。有关更多信息,请参见 第13.2.15节“ WITH(公用表表达式)”。从MySQL 8.0.19开始,
SELECT递归公用表表达式(CTE)的递归 部分支持LIMIT子句。LIMIT与OFFSET也支持。有关更多信息,请参见 递归公用表表达式。 -
窗口功能。 MySQL现在支持窗口函数,对于查询的每一行,都使用与该行相关的行来执行计算。这些包括诸如
RANK(),LAG(),和NTILE()。此外,现在可以将几个现有的聚合函数用作窗口函数(例如SUM()和AVG())。有关更多信息,请参见第12.21节“窗口函数”。 -
横向派生表。 现在,派生表之前可以带有
LATERAL关键字,以指定允许它引用(取决于)同一FROM子句中的先前表的列。横向派生表使某些SQL操作可能无法通过非横向派生表完成,或者需要效率较低的解决方法。请参见 第13.2.11.9节“侧面衍生表”。 -
单表DELETE语句中的别名。 在MySQL 8.0.16和更高版本中,单表
DELETE语句支持使用表别名。 -
正则表达式支持。 此前,MySQL的使用的亨利斯宾塞正则表达式库来支持正则表达式运算符(
REGEXP,RLIKE)。使用Unicode国际组件(ICU)重新实现了对正则表达式的支持,该组件提供了完整的Unicode支持并且是多字节安全的。该REGEXP_LIKE()函数以REGEXP和RLIKE运算符的方式执行正则表达式匹配 ,它们现在是该函数的同义词。此外,REGEXP_INSTR(),REGEXP_REPLACE(),和REGEXP_SUBSTR()函数可用于查找匹配位置并分别执行子字符串替换和提取。该regexp_stack_limit和regexp_time_limit系统变量提供由发动机匹配了资源消耗的控制。有关更多信息,请参见 第12.7.2节“正则表达式”。有关实现更改可能影响使用正则表达式的应用程序的方式的信息,请参见 正则表达式兼容性注意事项。 -
内部临时表。 的
TempTable存储引擎替换MEMORY存储引擎作为默认发动机用于在内存中的内部临时表。该TempTable存储引擎提供了有效的存储VARCHAR和VARBINARY列。的internal_tmp_mem_storage_engine会话变量定义了用于在存储器内的临时表的存储引擎。允许的值为TempTable(默认值)和MEMORY。该temptable_max_ram变量定义TempTable在将数据存储到磁盘之前存储引擎可以使用的最大内存量 。 -
正在记录。 错误记录已重写为使用MySQL组件体系结构。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录则是可加载的组件。此外,还提供了可加载的JSON日志编写器。要控制要启用的日志组件,请使用
log_error_services系统变量。有关更多信息,请参见 第5.4.2节“错误日志”。 -
备用锁。 一种新型的备份锁允许在联机备份期间使用DML,同时防止可能导致快照不一致的操作。
LOCK INSTANCE FOR BACKUP和UNLOCK INSTANCE语法支持新的备份锁 。该BACKUP_ADMIN权限才能使用这些语句。 -
复制。 对MySQL复制进行了以下增强:
-
MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,从而在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过将新的
binlog_row_value_options系统变量设置为来启用PARTIAL_JSON。有关更多信息,请参见JSON值的部分更新以及的描述binlog_row_value_options。
-
-
连接管理。 MySQL服务器现在允许专门为管理连接配置TCP / IP端口。这提供了用于普通连接的网络接口上允许的单个管理连接的替代方法,即使
max_connections已经建立连接也是如此。请参见 第5.1.12.1节“连接接口”。MySQL现在提供了对压缩使用的更多控制,以最大程度地减少通过与服务器的连接发送的字节数。以前,给定的连接未压缩或已使用
zlib压缩算法。现在,也可以使用该zstd算法,并选择zstd连接的压缩级别。可以在服务器端以及连接原始端配置允许的压缩算法,以通过客户端程序以及参与主/从复制或组复制的服务器进行连接。有关更多信息,请参见 第4.2.6节“连接压缩控制”。 -
组态。 在整个MySQL中,主机名的最大允许长度已从以前的60个字符增加到255个ASCII字符。例如,这适用于数据字典中与主机名相关的列,
mysql系统架构,性能架构INFORMATION_SCHEMA和sys;陈述的MASTER_HOST价值CHANGE MASTER TO;语句输出中的Host列SHOW PROCESSLIST;帐户名称中的主机名(例如帐户管理对帐单和DEFINER属性);以及与主机名相关的命令选项和系统变量。注意事项:
-
允许的主机名长度增加会影响在主机名列上具有索引的表。例如,
mysql系统架构中索引主机名的表现在具有显式ROW_FORMAT属性,DYNAMIC以容纳更长的索引值。 -
某些基于文件名的配置设置可能是基于服务器主机名构造的。允许的值受基础操作系统的约束,该操作系统可能不允许文件名足够长以包含255个字符的主机名。这会影响到
general_log_file,log_error,pid_file,relay_log,和slow_query_log_file系统变量和相应的选项。如果基于主机名的值对于OS而言太长,则必须提供明确的较短值。 -
尽管服务器现在支持255个字符的主机名,但是与使用该
--ssl-mode=VERIFY_IDENTITY选项建立的服务器的连接 受到OpenSSL支持的最大主机名长度的限制。主机名匹配与SSL证书的两个字段有关,它们的最大长度如下:公用名:最大长度为64;最大名称为64。主题备用名称:根据RFC#1034的最大长度。
-
-
插件。 以前,MySQL插件可以用C或C ++编写。插件使用的MySQL头文件现在包含C ++代码,这意味着插件必须用C ++而不是C编写。
-
C API。 MySQL C API现在支持异步功能,用于与MySQL服务器的非阻塞通信。每个功能都是现有同步功能的异步对应项。如果从服务器连接读取或写入服务器连接,则必须等待同步功能。异步功能使应用程序可以检查服务器连接上的工作是否准备就绪。如果不是,则该应用程序可以执行其他工作,然后再进行检查。请参见 第28.7.11节“ C API异步接口”。
-
演员表的其他目标类型。 功能
CAST()和CONVERT()现在支持转换到类型DOUBLE,FLOAT和REAL。在MySQL 8.0.17中添加。请参见第12.10节“广播函数和运算符”。 -
JSON模式验证。 MySQL 8.0.17添加了两个功能
JSON_SCHEMA_VALID(),JSON_SCHEMA_VALIDATION_REPORT()用于再次验证JSON文档JSON模式。JSON_SCHEMA_VALID()如果文档根据模式进行验证,则返回TRUE(1),否则通过FALSE(0)返回。JSON_SCHEMA_VALIDATION_REPORT()返回一个JSON文档,其中包含有关验证结果的详细信息。以下语句适用于这两个功能:-
模式必须符合JSON模式规范的草案4。
-
required支持属性。 -
$ref不支持 外部资源和关键字。 -
支持正则表达式模式;无效模式将被静默忽略。
有关更多信息和示例,请参见第12.17.7节“ JSON模式验证函数”。
-
-
多值索引。 从MySQL 8.0.17开始,
InnoDB支持创建多值索引,该索引是在JSON存储值数组的列上定义的辅助索引,并且单个数据记录可以具有多个索引记录。这样的索引使用诸如的关键部分定义CAST(data->'$.zipcode' AS UNSIGNED ARRAY)。MySQL优化程序会自动将多值索引用于合适的查询,如的输出所示EXPLAIN。作为这项工作的一部分,MySQL添加了一个新功能
JSON_OVERLAPS()和一个MEMBER OF()用于处理JSON文档的新 运算符,此外,还CAST()使用一个新ARRAY关键字扩展了该 功能, 如下表所示:-
JSON_OVERLAPS()比较两个JSON文档。如果它们包含任何共同的键值对或数组元素,则该函数返回TRUE(1); 否则返回FALSE(0)。如果两个值都是标量,则该函数将执行一个简单的相等性测试。如果一个参数是JSON数组,另一个参数是标量,则将标量视为数组元素。因此,可JSON_OVERLAPS()作为的补充JSON_CONTAINS()。 -
MEMBER OF()测试第一个操作数(标量或JSON文档)是否是作为第二个操作数传递的JSON数组的成员,如果是则返回TRUE(1),否则返回FALSE(0)。不执行操作数的类型转换。 -
CAST(允许通过将在JSON文档中找到的JSON数组expressionAStypeARRAY)json_path转换为SQL数组来创建功能索引 。类型说明符仅限于由已经支持的那些CAST(),以除外BINARY(不支持)。CAST()(和ARRAY关键字)的这种用法 仅受支持InnoDB,并且仅用于创建多值索引。
有关多值索引的详细信息(包括示例),请参阅 多值索引。 第12.17.3节“搜索JSON值的函数”,提供了有关
JSON_OVERLAPS()和的 信息MEMBER OF()以及使用示例。 -
-
提示time_zone。 从MySQL 8.0.17开始,
time_zone使用可以提示会话变量SET_VAR。 -
重做日志归档。 从MySQL 8.0.17开始,
InnoDB支持重做日志归档。在执行备份操作时,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的步伐,由于这些记录被覆盖,导致丢失重做日志记录。重做日志归档功能通过将重做日志记录顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件复制重做日志记录,从而避免潜在的数据丢失。有关更多信息,请参阅重做日志归档。 -
克隆插件。 从MySQL 8.0.17开始,MySQL提供了一个克隆插件,允许
InnoDB在本地或从远程MySQL服务器实例克隆数据。本地克隆操作将克隆的数据存储在运行MySQL实例的同一服务器或节点上。远程克隆操作通过网络将克隆的数据从施主MySQL服务器实例传输到发起克隆操作的接收者服务器或节点。克隆插件支持复制。除了克隆数据之外,克隆操作还从施主提取并传输复制坐标,并将其应用于接收者,从而可以使用克隆插件来配置组复制成员和复制从属。与复制大量事务相比,使用克隆插件进行配置要快得多,效率也更高。还可以将组复制成员配置为使用克隆插件作为替代的恢复方法,以便成员自动选择从种子成员中检索组数据的最有效方法。
有关更多信息,请参见第5.6.7节“克隆插件”和第18.4.3.1节“克隆分布式恢复”。
-
哈希联接优化。 从MySQL 8.0.18开始,只要联接中的每对表都至少包含一个等联接条件,就使用哈希联接。哈希联接不需要索引,并且在大多数情况下比块嵌套循环算法更有效。可以通过这种方式优化如此处所示的联接:
SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1; SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2) JOIN t3 ON (t2.c1 = t3.c1)哈希联接还可以用于笛卡尔积-即,未指定联接条件时。
您可以使用
EXPLAIN FORMAT=TREE或查看何时将哈希联接优化用于特定查询EXPLAIN ANALYZE。可以使用
optimizer_switch系统变量的hash_join标志(on默认情况下)以及HASH_JOIN和NO_HASH_JOIN优化程序提示来控制哈希联接的使用 。哈希联接可用的内存量受的值限制
join_buffer_size。在磁盘上执行需要更多内存的哈希联接;磁盘上的哈希联接可以使用的磁盘文件数受限制open_files_limit。从MySQL 8.0.19开始,MySQL 8.0.18中
hash_join引入的优化器开关不再起作用。这也适用于HASH_JOIN和NO_HASH_JOIN优化器提示。开关和提示现在都已弃用,并将在将来的MySQL版本中删除。在MySQL 8.0.20中,即使在查询不包含等联接条件的情况下,只要使用块嵌套循环,都将使用哈希联接。这适用于内部非等联接,半联接,反联接,左外部联接和右外部联接。此外,内部联接和外部联接(包括半联接和反联接)现在都可以使用批处理密钥访问(BKA),该批处理密钥访问会增量分配联接缓冲内存,这样单个查询就不需要消耗解析所需的大量资源。 。从MySQL 8.0.18开始,仅支持内部联接的BKA。
MySQL 8.0.20还用迭代器执行器替换了以前版本的MySQL中使用的执行器。这项工作包括为那些尚未优化为半联接的查询替换管理该格式查询的旧索引子查询引擎,以及以以前依赖于旧执行程序的相同形式实现的查询。
WHEREvalueIN (SELECTcolumnFROMtableWHERE ...)IN有关更多信息和示例,请参见 第8.2.1.4节“哈希联接优化”。另请参阅 批处理密钥访问联接。
-
EXPLAIN ANALYZE语句。 MySQL 8.0.18中实现了 一种新形式的
EXPLAIN语句,它以处理查询所用的每个迭代器的格式EXPLAIN ANALYZE提供了有关SELECT语句 执行的扩展信息TREE,并使得可以将估计成本与查询的实际成本进行比较。此信息包括启动成本,总成本,此迭代器返回的行数以及执行的循环数。在MySQL 8.0.20和更高版本中,该语句还支持
FORMAT=TREE说明符。TREE是唯一受支持的格式。有关更多信息,请参见使用EXPLAIN ANALYZE获取信息。
-
查询演员表注入。 在8.0.18及更高版本中,MySQL现在将表达式操作和条件数据与预期的数据类型不匹配的表达式和条件内的转换操作注入查询项树中。这对查询结果或执行速度没有影响,但是使查询的执行等同于符合SQL标准的查询,同时保持了与MySQL早期版本的向后兼容性。
现在这样的隐式转换的时间类型(之间执行
DATE,DATETIME,TIMESTAMP,TIME)和数字类型(SMALLINT,TINYINT,MEDIUMINT,INT/INTEGER,BIGINT;DECIMAL/NUMERIC;FLOAT,DOUBLE,REAL,BIT),只要他们正在使用任何标准的数字比较运算符(相较=,>=,>,<,<=,<>/!=,要么<=>)。在这种情况下,任何尚未为a的值DOUBLE都将强制转换为1。现在也执行强制转换注入,以比较DATE或TIME值与DATETIME值,其中,在必要时将参数强制转换 为DATETIME。因此能够看到通过查看的输出时石膏注入到一个给定的查询
EXPLAIN ANALYZE,EXPLAIN FORMAT=JSON或者,如下所示,EXPLAIN FORMAT=TREE:mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME); Query OK, 0 rows affected (0.62 sec) mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL); Query OK, 0 rows affected (0.51 sec) mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G *************************** 1. row *************************** EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double)) (cost=0.70 rows=1) -> Table scan on n (cost=0.35 rows=1) -> Hash -> Table scan on d (cost=0.35 rows=1)也可以通过执行看到这种强制类型转换
EXPLAIN [FORMAT=TRADITIONAL],在这种情况下,也有必要SHOW WARNINGS事后发布。 -
TIMESTAMP和DATETIME的时区支持。 从MySQL 8.0.19开始,服务器接受带有插入的datetime(
TIMESTAMP和DATETIME)值的时区偏移量。该偏移量使用与设置time_zone系统变量时使用的格式相同的格式,不同之处在于,当偏移量的小时部分小于10且'-00:00'不允许时,前导零是必需的 。日期时间文字,其中包括时区偏移的例子是'2019-12-11 10:40:30-05:00','2003-04-14 03:30:00+10:00'和'2020-01-01 15:35:45+05:30'。选择日期时间值时不显示时区偏移量。
包含时区偏移量的Datetime文字可用作准备好的语句参数值。
作为该工作的一部分,用于设置的值
time_zone系统变量现在也限制在范围-14:00到+14:00,包括端值。(它仍然可以分配名称值以time_zone诸如'EST','Posix/Australia/Brisbane'和'Europe/Stockholm'该变量,条件是MySQL的时区表被加载;另见 填充的时区表)。有关更多信息和示例,请参见 第5.1.14节“ MySQL服务器时区支持”以及 第11.2.2节“ DATE,DATETIME和TIMESTAMP类型”。
-
有关JSON模式CHECK约束失败的精确信息。 在
JSON_SCHEMA_VALID()用于指定CHECK约束时,MySQL 8.0.19和更高版本提供有关此类约束失败原因的准确信息。有关示例和更多信息,请参见 JSON_SCHEMA_VALID()和CHECK约束。另请参见第13.1.20.6节“检查约束”。
-
行和列别名具有ON DUPLICATE KEY UPDATE。 从MySQL 8.0.19开始,可以使用别名引用要插入的行,以及(可选)引用其列。考虑在具有列 和
INSERT的表t上的以下 语句 :abINSERT INTO t SET a=9,b=5 ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);使用
new新行的别名,在某些情况下,使用别名m和n该行的列,INSERT可以用许多不同的方式重写该 语句,此处显示了一些示例:INSERT INTO t SET a=9,b=5 AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t VALUES(9,5) AS new ON DUPLICATE KEY UPDATE a=new.a+new.b; INSERT INTO t SET a=9,b=5 AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n; INSERT INTO t VALUES(9,5) AS new(m,n) ON DUPLICATE KEY UPDATE a=m+n;欲了解更多信息和示例,请参见 第13.2.6.2,“INSERT ... ON DUPLICATE KEY UPDATE语句”。
-
SQL标准的显式表子句和表值构造函数。 根据SQL标准添加了表值构造函数和显式表子句。这些分别在MySQL 8.0.19中作为
TABLE语句和VALUES语句实现。该
TABLE语句具有格式,并且等效于。它支持 和 子句(后者带有optional ),但不允许选择单个表列。 可以在您使用等效 语句的任何地方使用;这包括连接,联合, ,, 语句和子查询。例如:TABLEtable_nameSELECT * FROMtable_nameORDER BYLIMITOFFSETTABLESELECTINSERT ... SELECTREPLACECREATE TABLE ... SELECT-
TABLE t1 UNION TABLE t2相当于SELECT * FROM t1 UNION SELECT * FROM t2 -
CREATE TABLE t2 TABLE t1相当于CREATE TABLE t2 SELECT * FROM t1 -
SELECT a FROM t1 WHERE b > ANY (TABLE t2)等同于SELECT a FROM t1 WHERE b > ANY (SELECT * FROM t2)。
VALUES可用于一个表值提供给一个INSERT,REPLACE或SELECT语句,和由的VALUES关键字随后进行了一系列行构造(的ROW())由逗号分隔。例如,该语句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)。您还可以像选择VALUES表一样从表值构造函数中进行选择 ,请记住,这样做时必须提供表别名,并像使用SELECT其他别名一样使用它 。这包括联接,联合和子查询。有关详细信息
TABLE,并VALUES和其使用的示例,请参阅本文档的以下部分: -
-
FORCE INDEX,IGNORE INDEX的优化程序提示。 MySQL 8.0引入了索引级优化器提示,这些提示与第8.9.4节“索引提示”中所述的传统索引提示类似。新的提示这里列出,与他们一起
FORCE INDEX或IGNORE INDEX等价物:-
GROUP_INDEX: 相当于FORCE INDEX FOR GROUP BYNO_GROUP_INDEX: 相当于IGNORE INDEX FOR GROUP BY -
JOIN_INDEX: 相当于FORCE INDEX FOR JOINNO_JOIN_INDEX: 相当于IGNORE INDEX FOR JOIN -
ORDER_INDEX: 相当于FORCE INDEX FOR ORDER BYNO_ORDER_INDEX: 相当于IGNORE INDEX FOR ORDER BY -
INDEX:与GROUP_INDEX加JOIN_INDEX号 相同ORDER_INDEX; 等同于FORCE INDEX没有修饰符NO_INDEX:与NO_GROUP_INDEX加NO_JOIN_INDEX号 相同NO_ORDER_INDEX; 等同于IGNORE INDEX没有修饰符
例如,以下两个查询是等效的:
SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2; SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;前面列出的优化器提示在语法和用法上与现有索引级优化器提示遵循相同的基本规则。
这些优化器提示旨在替换
FORCE INDEX和IGNORE INDEX,我们计划在将来的MySQL版本中弃用和,然后从MySQL中删除。他们没有实现的单个精确等效项USE INDEX;相反,你可以使用一个或多个NO_INDEX,NO_JOIN_INDEX,NO_GROUP_INDEX,或NO_ORDER_INDEX达到同样的效果。有关更多信息和使用示例,请参见“ 索引级优化器提示”。
-
-
JSON_VALUE()函数。 MySQL 8.0.21实现了
JSON_VALUE()旨在简化JSON列索引的新功能 。在最基本的形式中,它将JSON文档和指向该文档中单个值的JSON路径作为参数,以及(可选)允许您使用RETURNING关键字指定返回类型 。 等效于此:JSON_VALUE(json_doc,pathRETURNINGtype)CAST( JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) ) AS type );您还可以指定
ON EMPTY,ON ERROR或两者的条款,类似于使用的那些JSON_TABLE()。您可以使用
JSON_VALUE()在这样的JSON列上的表达式上创建索引:CREATE TABLE t1( j JSON, INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) ) ); INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');使用此表达式的查询(如此处所示)可以使用索引:
SELECT name, price FROM t1 WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;在许多情况下,这比从该
JSON列创建一个生成的列然后在生成的列上创建索引要简单得多。有关更多信息和示例,请参见的描述
JSON_VALUE()。 -
用户评论和用户属性。 MySQL 8.0.21引入了在创建或更新用户帐户时设置用户注释和用户属性的功能。用户注释包括作为参数传递
COMMENT给与CREATE USERorALTER USER语句一起使用的子句的任意文本。用户属性由JSON对象形式的数据组成,该数据作为参数传递给与ATTRIBUTE这两个语句之一一起使用的 子句。该属性可以包含JSON对象表示法中的任何有效键值对。仅一个COMMENT或ATTRIBUTE可以在单一使用CREATE USER或ALTER USER声明。用户注释和用户属性在内部作为JSON对象存储在一起,注释文本作为元素的值
comment作为其键。可以从 表的ATTRIBUTE列中 检索此信息INFORMATION_SCHEMA.USER_ATTRIBUTES。因为它是JSON格式,所以您可以使用MySQL的JSON函数和运算符来解析其内容(请参见 第12.17节“ JSON函数”)。与使用该JSON_MERGE_PATCH()函数时一样,对用户属性的连续更改将与其当前值合并。例:
mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account'; Query OK, 0 rows affected (0.33 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}'; Query OK, 0 rows affected (0.14 sec) mysql> ALTER USER 'mary'@'localhost' -≫ ATTRIBUTE '{"email":"mary.smith@example.com"}'; Query OK, 0 rows affected (0.12 sec) mysql> SELECT -> USER, -> HOST, -> ATTRIBUTE->>"$.fname" AS 'First Name', -> ATTRIBUTE->>"$.lname" AS 'Last Name', -> ATTRIBUTE->>"$.email" AS 'Email', -> ATTRIBUTE->>"$.comment" AS 'Comment' -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES -> WHERE USER='mary' AND HOST='localhost'\G *************************** 1. row *************************** USER: mary HOST: localhost First Name: Mary Last Name: Smith Email: mary.smith@example.com Comment: This is Mary Smith's account 1 row in set (0.00 sec)有关更多信息和示例,请参见 第13.7.1.3节“ CREATE USER语句”,第13.7.1.1节“ ALTER USER语句”和第25.41节“ INFORMATION_SCHEMA USER_ATTRIBUTES表”。
-
optimizer_switch preferred_ordering_index标志。 默认情况下,MySQL总是尝试对具有 子句的任何查询
ORDER BY或GROUP BY查询使用有序索引LIMIT(reconsidering_access_paths_for_index_ordering优化)。由于在某些情况下为此类查询选择不同的优化实际上可能会更好地执行,因此从MySQL 8.0.21开始,可以通过将optimizer_switch系统变量的prefer_ordering_index标志设置为来禁用此优化off。有关更多信息,请参见 第8.9.2节“可切换优化”和 第8.2.1.19节“ LIMIT查询优化”。
以下功能在MySQL 8.0中已弃用,并且在以后的系列中可能会或将被删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用在更高版本的MySQL系列中已删除的MySQL 8.0中不推荐使用的功能的应用程序,将语句从MySQL 8.0主服务器复制到更高系列的从服务器时,语句可能会失败,或对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用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安装应过渡到使用组件。请参见 第6.4.3.3节“过渡到密码验证组件”。 -
和 语句 的
ENGINE子句 已弃用。ALTER TABLESPACEDROP TABLESPACE -
在
PAD_CHAR_TO_FULL_LENGTHSQL模式已经过时了。 -
AUTO_INCREMENT不支持类型FLOAT和DOUBLE(以及任何同义词)的列。考虑AUTO_INCREMENT从此类列中删除属性,或将其转换为整数类型。 -
的
UNSIGNED属性被弃用类型的列FLOAT,DOUBLE和DECIMAL(和任何同义词)。考虑CHECK对此类列使用简单约束。 -
FLOAT(和 语法指定的位数类型的列的数目 和 (和任何同义词)是一个非标准MySQL扩展。不建议使用此语法。M,D)DOUBLE(M,D)FLOATDOUBLE -
ZEROFILL对于数字数据类型,不建议使用 该属性,对于整数数据类型,则不建议使用显示宽度属性。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用该LPAD()功能对数字进行零填充以达到所需的宽度,或者可以将格式化的数字存储在CHAR列中。 -
对于字符串数据类型,该
BINARY属性是非标准的MySQL扩展,它是用于指定_bin列字符集(如果未指定列字符集,则为表默认字符集)的二进制()归类的简写形式。在MySQL 8.0中,这种非标准用法BINARY是不明确的,因为utf8mb4字符集具有多个_bin排序规则,因此BINARY不赞成使用该属性,并且在将来的MySQL版本中将删除对该 属性的支持。应将应用程序调整为使用显式_bin排序规则。BINARY用于指定数据类型或字符集 的用法保持不变。 -
非标准C风格
&&,||和!运营商认为是标准的SQL同义词AND,OR和NOT运营商,分别已被取消。使用非标准运算符的应用程序应调整为使用标准运算符。注意使用的
||,除非被弃用PIPES_AS_CONCAT启用SQL模式。在这种情况下,||表示SQL标准字符串连接运算符。 -
该
JSON_MERGE()功能已弃用。使用JSON_MERGE_PRESERVE()代替。 -
不建议使用
SQL_CALC_FOUND_ROWS查询修饰符和附带FOUND_ROWS()函数。有关FOUND_ROWS()替代策略的信息,请参见 说明。 -
从MySQL 8.0.13开始,不 支持
TABLESPACE = innodb_file_per_tableandTABLESPACE = innodb_temporary子句CREATE TEMPORARY TABLE。 -
对于
SELECT语句,自MySQL 8.0.20起,不建议在末尾使用INTO子句,FROM但不要在末尾SELECT使用子句。最好将放在INTO语句的末尾。对于
UNION语句,INTO从MySQL 8.0.20开始不推荐使用这两个包含的变体:-
在查询表达式的结尾查询块中,使用
INTObeforeFROM。 -
在查询表达式的带括号的尾随块中,请使用
INTO,而不管其相对于的位置FROM。
请参见第13.2.10.1节“ SELECT ... INTO语句”和 第13.2.10.3节“ UNION子句”。
-
-
该mysql_upgrade客户端已被弃用,因为它的功能升级的系统表
mysql系统架构和对象在其他模式已移动到MySQL服务器。请参见 第2.11.3节“ MySQL升级过程将升级什么”。 -
该
--no-dd-upgrade服务器选项已被弃用。它被--upgrade选件取代,该 选件可以更好地控制数据字典和服务器升级行为。 -
该
mysql_upgrade_info文件(已创建数据目录并用于存储MySQL版本号)已被弃用,并将在以后的MySQL版本中删除。 -
不建议使用
relay_log_info_file系统变量和--master-info-file选项。以前,这些被用来当指定中继日志信息记录和掌握信息日志的名称relay_log_info_repository=FILE,并master_info_repository=FILE分别设置,但这些设置已被弃用。碰撞日志从属表已取代了用于中继日志信息日志和主信息日志的文件,这是MySQL 8.0中的默认设置。 -
该
max_length_for_sort_data系统变量现在已经过时,由于优化的变化,使其过时的没有效果,。 -
不建议使用这些旧参数来压缩与服务器的连接:
--compress客户端命令行选项;C API函数的MYSQL_OPT_COMPRESS选项mysql_options();该slave_compressed_protocol系统变量。有关替代使用的参数的信息,请参见 第4.2.6节“连接压缩控制”。 -
不建议使用
MYSQL_PWD环境变量来指定MySQL密码。 -
从MySQL 8.0.20开始,不赞成 使用
VALUES()来访问中的新行值INSERT ... ON DUPLICATE KEY UPDATE。请为新的行和列使用别名。 -
因为
ON ERROR在ON EMPTY调用时指定before 违反JSON_TABLE()了SQL标准,所以现在在MySQL中不推荐使用此语法。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印警告。在单个JSON_TABLE()调用中指定这两个子句时,请确保ON EMPTY首先使用该子句。
以下各项已过时,并且已在MySQL 8.0中删除。在显示替代方案的地方,应更新应用程序以使用它们。
对于使用在MySQL 8.0中删除的功能的MySQL 5.7应用程序,将语句从MySQL 5.7主服务器复制到MySQL 8.0从服务器时,语句可能会失败,或对主服务器和从服务器产生不同的影响。为避免此类问题,应修改使用MySQL 8.0中已删除功能的应用程序以避免这些问题,并在可能的情况下使用替代方法。
-
在
innodb_locks_unsafe_for_binlog除去系统变量。该READ COMMITTED隔离级别提供了类似的功能。 -
information_schema_statsMySQL 8.0.0中引入 的变量已删除,并information_schema_stats_expiry在MySQL 8.0.3中被替换 。information_schema_stats_expiry定义缓存INFORMATION_SCHEMA表统计信息的到期设置 。有关更多信息,请参见 第8.2.3节“优化INFORMATION_SCHEMA查询”。 -
与已过时的
InnoDB系统表相关的代码已在MySQL 8.0.3中删除。INFORMATION_SCHEMA基于InnoDB系统表的视图被数据字典表上的内部系统视图替换。受影响的InnoDBINFORMATION_SCHEMA视图已重命名:表1.1重命名的InnoDB信息架构视图
旧名称 新名字 INNODB_SYS_COLUMNSINNODB_COLUMNSINNODB_SYS_DATAFILESINNODB_DATAFILESINNODB_SYS_FIELDSINNODB_FIELDSINNODB_SYS_FOREIGNINNODB_FOREIGNINNODB_SYS_FOREIGN_COLSINNODB_FOREIGN_COLSINNODB_SYS_INDEXESINNODB_INDEXESINNODB_SYS_TABLESINNODB_TABLESINNODB_SYS_TABLESPACESINNODB_TABLESPACESINNODB_SYS_TABLESTATSINNODB_TABLESTATSINNODB_SYS_VIRTUALINNODB_VIRTUAL
升级到MySQL 8.0.3或更高版本后,请更新所有引用先前
InnoDBINFORMATION_SCHEMA视图名称的脚本。 -
与帐户管理相关的以下功能已删除:
-
使用
GRANT创建用户。而是使用CREATE USER。遵循这种做法会使NO_AUTO_CREATE_USERSQL模式对GRANT语句不重要,因此也将其删除,并且当sql_mode选项文件中选项的该值的存在阻止mysqld启动时,现在会将错误写入服务器日志。 -
使用
GRANT修改不是权限指派其他帐户属性。这包括身份验证,SSL和资源限制属性。而是在创建帐户时使用CREATE USER或在之后使用修改这些 属性ALTER USER。 -
IDENTIFIED BY PASSWORD 'auth_string'CREATE USER和的 语法GRANT。而是使用 for 和 ,其中 值的格式与命名插件兼容。IDENTIFIED WITHauth_pluginAS 'auth_string'CREATE USERALTER USER'auth_string'此外,由于
IDENTIFIED BY PASSWORD删除了语法,因此log_builtin_as_identified_by_password系统变量是多余的,并且已删除。 -
该
PASSWORD()功能。此外,PASSWORD()删除意味着 语法不再可用。SET PASSWORD ... = PASSWORD('auth_string') -
该
old_passwords系统变量。
-
-
查询缓存已删除。删除包括以下项目:
-
该
FLUSH QUERY CACHE和RESET QUERY CACHE语句。 -
这些系统变量:
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。 -
这些线程状态:
checking privileges on cached query,checking query cache for query,invalidating query cache entries,sending cached result to client,storing result in query cache,Waiting for query cache lock。 -
该
SQL_CACHESELECT修改。
这些不赞成使用的查询缓存项仍然不赞成使用,但没有效果,将在以后的MySQL版本中删除:
-
SQL_NO_CACHESELECT修饰符。 -
该
ndb_cache_check_time系统变量。
该
have_query_cache系统变量保持过时,总有一个价值NO,并会在将来的MySQL版本中删除。 -
-
数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称以查找数据库。因此,
--ignore-db-dir选项和ignore_db_dirs系统变量是多余的并被删除。 -
DDL日志(也称为元数据日志)已被删除。从MySQL 8.0.3开始,此功能由数据字典
innodb_ddl_log表处理 。请参阅 查看DDL日志。 -
该
tx_isolation和tx_read_only系统变量已被删除。使用transaction_isolation和transaction_read_only代替。 -
该
sync_frm系统变量已被删除,因为.frm文件已经过时。 -
该
secure_auth系统变量和--secure-auth客户端选项已被删除。C API函数的MYSQL_SECURE_AUTH选项mysql_options()已删除。 -
的
multi_range_count系统变量被移除。 -
该
log_warnings系统变量和--log-warnings服务器选项已被删除。请改用log_error_verbosity系统变量。 -
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,MSSQL,MYSQL323,MYSQL40,ORACLE,POSTGRESQL,NO_FIELD_OPTIONS,NO_KEY_OPTIONS,NO_TABLE_OPTIONS。它们不能再分配给sql_mode系统变量或用作mysqldump--compatible选项的允许值 。删除
MAXDB意味着将或 的TIMESTAMP数据类型 视为 ,而不再视为。CREATE TABLEALTER TABLETIMESTAMPDATETIME -
子句 的不推荐使用
ASC或DESC限定符将GROUP BY被删除。先前依赖于GROUP BY排序的查询所产生的结果可能与以前的MySQL版本不同。要产生给定的排序顺序,请提供一个ORDER BY子句。 -
该语句的
EXTENDED和PARTITIONS关键字EXPLAIN已删除。这些关键字是不必要的,因为它们的效果始终处于启用状态。 -
这些与加密有关的项目已删除:
-
该
ENCODE()和DECODE()功能。 -
该
ENCRYPT()功能。 -
的
DES_ENCRYPT(),和DES_DECRYPT()功能的--des-key-file选项,have_crypt系统变量,则DES_KEY_FILE该选项FLUSH语句和HAVE_CRYPTCMake的 选项。
代替删除的加密功能:对于
ENCRYPT(),请考虑SHA2()改为使用 单向哈希。对于其他,请考虑使用AES_ENCRYPT()和AES_DECRYPT()代替。 -
-
在MySQL 5.7中,不建议使用多个名称下的多个空间函数,以便朝着使空间函数名称空间更一致的方向移动,其目标是每个空间函数名称
ST_以其执行精确操作或以MBR执行一个基于最小边界矩形的操作。在MySQL 8.0中,不赞成使用的函数被删除,仅留下相应的ST_和MBR函数:-
这些功能有利于去除
MBR名称:Contains(),Disjoint(),Equals(),Intersects(),Overlaps(),Within()。 -
这些功能有利于去除
ST_名称:Area(),AsBinary(),AsText(),AsWKB(),AsWKT(),Buffer(),Centroid(),ConvexHull(),Crosses(),Dimension(),Distance(),EndPoint(),Envelope(),ExteriorRing(),GeomCollFromText(),GeomCollFromWKB(),GeomFromText(),GeomFromWKB(),GeometryCollectionFromText(),GeometryCollectionFromWKB(),GeometryFromText(),GeometryFromWKB(),GeometryN(),GeometryType(),InteriorRingN(),IsClosed(),IsEmpty(),IsSimple(),LineFromText(),LineFromWKB(),LineStringFromText(),LineStringFromWKB(),MLineFromText(),MLineFromWKB(),MPointFromText(),MPointFromWKB(),MPolyFromText(),MPolyFromWKB(),MultiLineStringFromText(),MultiLineStringFromWKB(),MultiPointFromText(),MultiPointFromWKB(),MultiPolygonFromText(),MultiPolygonFromWKB(),NumGeometries(),NumInteriorRings(),NumPoints(),PointFromText(),PointFromWKB(),PointN(),PolyFromText(),PolyFromWKB(),PolygonFromText(),PolygonFromWKB(),SRID(),StartPoint(),Touches(),X(),Y()。 -
GLength()被取消赞成ST_Length()。
-
-
第12.16.4节“从WKB值创建几何值 的函数”中描述的函数 以前接受WKB字符串或几何参数。几何参数不再被允许并产生错误。有关从不使用几何参数迁移查询的准则,请参见该部分。
-
解析器不再视为SQL语句中
\N的同义词NULL。使用NULL代替。这种变化不影响文本文件导入和导出操作与执行
LOAD DATA或SELECT ... INTO OUTFILE用于其NULL继续受到代表\N。请参见 第13.2.7节“ LOAD DATA语句”。 -
PROCEDURE ANALYSE()语法已删除。 -
客户端
--ssl和--ssl-verify-server-cert选项已被删除。使用--ssl-mode=REQUIRED代替--ssl=1或--enable-ssl。使用--ssl-mode=DISABLED替代--ssl=0,--skip-ssl或--disable-ssl。使用--ssl-mode=VERIFY_IDENTITY代替--ssl-verify-server-cert选项。(服务器端--ssl选项保持不变。)对于C API,
MYSQL_OPT_SSL_ENFORCE和的MYSQL_OPT_SSL_VERIFY_SERVER_CERT选项mysql_options()对应于客户端--ssl和--ssl-verify-server-cert选项,并被删除。使用MYSQL_OPT_SSL_MODE选项值SSL_MODE_REQUIRED或SSL_MODE_VERIFY_IDENTITY代替。 -
该
--temp-pool移除服务器选项。 -
的
ignore_builtin_innodb系统变量被移除。 -
服务器不再通过添加
#mysql50#前缀将包含特殊字符的MySQL 5.1之前的数据库名称转换为5.1格式。由于不再执行这些转换,因此删除了mysqlcheck的--fix-db-names和--fix-table-names选项, 语句的UPGRADE DATA DIRECTORY NAME子句ALTER DATABASE以及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分发中删除。数据目录初始化应通过使用 或 选项调用mysqld来执行 。另外,删除了mysql_install_db使用的 mysqld 选项,并删除 了控制mysql_install_db安装位置的 选项。
--initialize--initialize-insecure--bootstrapINSTALL_SCRIPTDIRCMake -
通用分区处理程序已从MySQL服务器中删除。为了支持给定表的分区,用于该表的存储引擎现在必须提供其自己的(“ 本机 ”)分区处理程序。在
--partition和--skip-partition选项从MySQL服务器删除,分区相关条目中的输出不再显示SHOW PLUGINS或在INFORMATION_SCHEMA.PLUGINS表中。当前有两个MySQL存储引擎提供本机分区支持:
InnoDB和NDB。其中,InnoDBMySQL 8.0 仅 支持。使用任何其他存储引擎在MySQL 8.0中创建分区表的任何尝试都会失败。升级的后果。 不支持 使用除
InnoDB(例如MyISAM)以外的存储引擎将分区表从MySQL 5.7(或更早版本)直接升级到MySQL 8.0。处理此类表有两种选择:-
使用删除表的分区
ALTER TABLE ... REMOVE PARTITIONING。 -
更改用于表的存储引擎
InnoDB,用ALTER TABLE ... ENGINE=INNODB。
在
InnoDB将服务器升级到MySQL 8.0之前,必须对每个分区的非表至少执行上述两个操作之一。否则,升级后将无法使用该表。由于使用存储引擎在没有分区支持的情况下会导致创建分区表的表创建语句现在由于错误而失败(ER_CHECK_NOT_IMPLEMENTED),因此必须确保转储文件中的任何语句(例如mysqldump编写的语句)从您希望导入到创建分区表的MySQL 8.0服务器的MySQL的较早版本开始,也没有指定
MyISAM没有本地分区处理程序的存储引擎 。您可以通过执行以下任一操作来实现:-
从
CREATE TABLE对STORAGE ENGINE选项使用非值的语句中删除对分区的所有引用InnoDB。 -
将存储引擎指定为
InnoDB,或者InnoDB默认情况下允许 用作表的存储引擎。
有关更多信息,请参见 第23.6.2节“与存储引擎有关的分区限制”。
-
-
系统和状态变量信息不再保存在中
INFORMATION_SCHEMA。这些表被删除:GLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUS。请改用相应的性能架构表。请参见 第26.12.14节“性能模式系统变量表”和 第26.12.15节“性能模式状态变量表”。另外,show_compatibility_56系统变量也被删除。它用于过渡期间,在此期间,系统和状态变量信息INFORMATION_SCHEMA表已移至Performance Schema表,并且不再需要。这些状态变量被删除:Slave_heartbeat_period,Slave_last_heartbeat,Slave_received_heartbeats,Slave_retried_transactions,Slave_running。性能架构表中提供了它们提供的信息。请参阅 迁移到性能模式系统和状态变量表。 -
性能模式
setup_timers表已删除,表中的TICK行 也已删除performance_timers。 -
该
libmysqld嵌入式服务器库被删除,连同:-
在, , ,和 选项
mysql_options()MYSQL_OPT_GUESS_CONNECTIONMYSQL_OPT_USE_EMBEDDED_CONNECTIONMYSQL_OPT_USE_REMOTE_CONNECTIONMYSQL_SET_CLIENT_IP -
该mysql_config
--libmysqld-libs,--embedded-libs和--embedded选项 -
该CMake的
WITH_EMBEDDED_SERVER,WITH_EMBEDDED_SHARED_LIBRARY和INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项 -
(未记录)mysql
--server-arg选项 -
该mysqltest
--embedded-server,--server-arg和--server-file选项 -
该mysqltest_embedded和 mysql_client_test_embedded测试程序
-
-
该mysql_plugin移除工具。替代方法包括在服务器启动时使用
--plugin-load或--plugin-load-add选项或在运行时使用该INSTALL PLUGIN语句加载插件。 -
该的resolveip工具被删除。 可以改用nslookup,host或 dig。
-
该resolve_stack_dump工具被删除。官方MySQL构建中的堆栈跟踪始终是符号化的,因此无需使用 resolve_stack_dump。
-
以下服务器错误代码未使用且已删除。专门测试其中任何一个错误的应用程序都应该更新。
ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE ER_BINLOG_ROW_RBR_TO_SBR ER_BINLOG_ROW_WRONG_TABLE_DEF ER_CANT_ACTIVATE_LOG ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION ER_CANT_CREATE_FEDERATED_TABLE ER_CANT_CREATE_SROUTINE ER_CANT_DELETE_FILE ER_CANT_GET_WD ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF ER_CANT_SET_WD ER_CANT_WRITE_LOCK_LOG_TABLE ER_CREATE_DB_WITH_READ_LOCK ER_CYCLIC_REFERENCE ER_DB_DROP_DELETE ER_DELAYED_NOT_SUPPORTED ER_DIFF_GROUPS_PROC ER_DISK_FULL ER_DROP_DB_WITH_READ_LOCK ER_DROP_USER ER_DUMP_NOT_IMPLEMENTED ER_ERROR_DURING_CHECKPOINT ER_ERROR_ON_CLOSE ER_EVENTS_DB_ERROR ER_EVENT_CANNOT_DELETE ER_EVENT_CANT_ALTER ER_EVENT_COMPILE_ERROR ER_EVENT_DATA_TOO_LONG ER_EVENT_DROP_FAILED ER_EVENT_MODIFY_QUEUE_ERROR ER_EVENT_NEITHER_M_EXPR_NOR_M_AT ER_EVENT_OPEN_TABLE_FAILED ER_EVENT_STORE_FAILED ER_EXEC_STMT_WITH_OPEN_CURSOR ER_FAILED_ROUTINE_BREAK_BINLOG ER_FLUSH_MASTER_BINLOG_CLOSED ER_FORM_NOT_FOUND ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED ER_FRM_UNKNOWN_TYPE ER_GOT_SIGNAL ER_GRANT_PLUGIN_USER_EXISTS ER_GTID_MODE_REQUIRES_BINLOG ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST ER_HASHCHK ER_INDEX_REBUILD ER_INNODB_NO_FT_USES_PARSER ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR ER_LOAD_DATA_INVALID_COLUMN_UNUSED ER_LOGGING_PROHIBIT_CHANGING_OF ER_MALFORMED_DEFINER ER_MASTER_KEY_ROTATION_ERROR_BY_SE ER_NDB_CANT_SWITCH_BINLOG_FORMAT ER_NEVER_USED ER_NISAMCHK ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR ER_NO_FILE_MAPPING ER_NO_GROUP_FOR_PROC ER_NO_RAID_COMPILED ER_NO_SUCH_KEY_VALUE ER_NO_SUCH_PARTITION__UNUSED ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED ER_ORDER_WITH_PROC ER_PARTITION_SUBPARTITION_ERROR ER_PARTITION_SUBPART_MIX_ERROR ER_PART_STATE_ERROR ER_PASSWD_LENGTH ER_QUERY_ON_MASTER ER_RBR_NOT_AVAILABLE ER_SKIPPING_LOGGED_TRANSACTION ER_SLAVE_CHANNEL_DELETE ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT ER_SLAVE_MUST_STOP ER_SLAVE_WAS_NOT_RUNNING ER_SLAVE_WAS_RUNNING ER_SP_GOTO_IN_HNDLR ER_SP_PROC_TABLE_CORRUPT ER_SQL_MODE_NO_EFFECT ER_SR_INVALID_CREATION_CTX ER_TABLE_NEEDS_UPG_PART ER_TOO_MUCH_AUTO_TIMESTAMP_COLS ER_UNEXPECTED_EOF ER_UNION_TABLES_IN_DIFFERENT_DIR ER_UNSUPPORTED_BY_REPLICATION_THREAD ER_UNUSED1 ER_UNUSED2 ER_UNUSED3 ER_UNUSED4 ER_UNUSED5 ER_UNUSED6 ER_VIEW_SELECT_DERIVED_UNUSED ER_WRONG_MAGIC ER_WSAS_FAILED -
不推荐使用
INFORMATION_SCHEMAINNODB_LOCKS,并INNODB_LOCK_WAITS表将被删除。请改用性能架构data_locks和data_lock_waits表。注意在MySQL 5.7中,
LOCK_TABLE在列INNODB_LOCKS表和locked_table在列sys模式innodb_lock_waits和x$innodb_lock_waits视图包含组合模式/表名的值。在MySQL 8.0中,data_locks表和sys架构视图包含单独的架构名称和表名称列。请参见 第27.4.3.9节“ innodb_lock_waits和x $ innodb_lock_waits视图”。 -
InnoDB不再支持压缩的临时表。当innodb_strict_mode启用(默认值),CREATE TEMPORARY TABLE如果返回错误ROW_FORMAT=COMPRESSED或KEY_BLOCK_SIZE指定的。如果innodb_strict_mode禁用此选项,则会发出警告,并使用非压缩的行格式创建临时表。 -
InnoDB在MySQL数据目录之外创建表空间数据文件时,不再创建.isl文件(InnoDB符号链接文件)。innodb_directories现在,该 选件支持查找在数据目录外部创建的表空间文件。通过此更改,
.isl不再支持在服务器脱机时通过手动修改文件来移动远程表空间 。该innodb_directories选项现在支持移动远程表空间文件 。请参见第15.6.3.6节“在服务器脱机时移动表空间文件”。 -
以下
InnoDB文件格式变量已删除:文件格式变量对于创建与
InnoDBMySQL 5.1 早期版本兼容的表是必需的 。现在,MySQL 5.1的产品生命周期已经结束,不再需要这些选项。该
FILE_FORMAT列已从INNODB_TABLES和INNODB_TABLESPACES信息模式表中删除。 -
innodb_support_xa删除了支持XA事务中两阶段提交 的系统变量。InnoDB始终启用对XA事务中的两阶段提交的支持。 -
对DTrace的支持已删除。
-
该
JSON_APPEND()功能已删除。使用JSON_ARRAY_APPEND()代替。 -
InnoDBMySQL 8.0.13中删除了 对将表分区放置在共享 表空间中的支持。共享表空间包括InnoDB系统表空间和常规表空间。有关在共享表空间中标识分区并将其移至每个表文件表空间的信息,请参见第2.11.5节“为升级准备安装”。 -
支持
SET在MySQL 8.0.13中弃用的语句中设置用户变量 。此功能可能会在MySQL 9.0中删除。 -
该
--ndbPERROR移除选项。请改用ndb_perror实用程序。 -
该
innodb_undo_logs变量已删除。该innodb_rollback_segments变量执行相同的功能,应该代替。 -
在
Innodb_available_undo_logs取出状态变量。每个表空间可用的回滚段数可以使用SHOW VARIABLES LIKE 'innodb_rollback_segments'; -
从MySQL 8.0.14开始,先前弃用的
innodb_undo_tablespaces变量不再可配置。有关更多信息,请参见第15.6.3.4节“撤消表空间”。 -
对
ALTER TABLE ... UPGRADE PARTITIONING语句的支持已删除。 -
从MySQL 8.0.16开始,
internal_tmp_disk_storage_engine已经删除了对系统变量的支持 。现在,磁盘上的内部临时表始终使用InnoDB存储引擎。有关更多信息,请参阅 磁盘内部临时表的存储引擎。 -
该CMake的选择是不使用的,并已被删除。
DISABLE_SHARED
QQ二群 166427999
如果项目有技术瓶颈问题,请联系↓↓
QQ: 903464207
微信: zx903464207
浙公网安备 33010602011771号