• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • MySQL8的新增功能

    本节总结了已添加到MySQL 8.0中,已弃用和从MySQL 8.0中删除的内容。随附的部分列出了在MySQL 8.0中已添加,不建议使用或删除的MySQL服务器选项和变量。请参见“在MySQL 8.0中添加,不建议使用或删除的服务器和状态变量及选项”。

    • MySQL 8.0中添加的功能
    • MySQL 8.0中不推荐使用的功能
    • MySQL 8.0中删除的功能

    MySQL 8.0中添加的功能

    以下功能已添加到MySQL 8.0:

    • 数据字典。 MySQL现在合并了一个事务性数据字典,用于存储有关数据库对象的信息。在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。有关更多信息,请参见“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服务器选项可控制服务器如何执行自动数据字典和服务器升级操作。有关更多信息,请参见 MySQL升级过程将升级什么”。

    • 安全性和帐户管理。添加了这些增强功能,以提高安全性并在帐户管理中提供更大的DBA灵活性:

      • mysql现在,系统数据库中的授权表是InnoDB(事务性)表。以前,这些是MyISAM(非事务性)表。授予表存储引擎的更改是帐户管理对帐单行为的伴随更改的基础。以前,帐户管理对帐单(例如CREATE USERDROP USER),命名多个用户可以对某些用户成功,而对其他用户则失败。现在,每个语句都是事务性的,并且对于所有命名的用户都成功,或者回滚,并且在发生任何错误时都不起作用。如果成功,则将语句写入二进制日志;如果失败,则不写入语句。在这种情况下,将发生回滚并且不进行任何更改。有关更多信息,请参见第13.1.1节“原子数据定义语句支持”。
      • 一个新的caching_sha2_password身份验证插件可用。像sha256_password插件一样,caching_sha2_password实现SHA-256密码哈希,但是使用缓存来解决连接时的延迟问题。它还支持更多的连接协议,并且不需要针对基于RSA密钥对的密码交换功能而针对OpenSSL进行链接。请参见第6.4.1.2节“缓存SHA-2可插拔身份验证”。

        caching_sha2_passwordsha256_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语句”。AS user[WITH ROLE]
      • MySQL现在维护有关密码历史记录的信息,从而限制了对先前密码的重用。DBA可能要求在一定数量的密码更改或一段时间内,不要从以前的密码中选择新密码。可以在全局范围内以及每个帐户基础上建立密码重用策略。

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

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

        MySQL现在使管理员能够配置用户帐户,以使由于密码错误而导致的连续登录失败过多,从而导致临时帐户锁定。所需的失败次数和锁定时间可以每个帐户配置。

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

      • 如果使用OpenSSL进行编译,MySQL现在支持FIPS模式,并且在运行时可以使用OpenSSL库和FIPS对象模块。FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。请参见“ FIPS支持”。
      • 服务器用于新连接的SSL上下文现在可以在运行时重新配置。例如,此功能可能很有用,可避免重启已经运行了很长时间以至于其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与资源组关联,并为组分配线程。有关更多信息,请参见第8.12.5节“资源组”。
    • 表加密管理。现在可以通过定义和强制执行加密默认值来全局管理表加密。该default_table_encryption变量为新创建的模式和常规表空间定义加密默认值。DEFAULT ENCRYPTION创建模式时,也可以使用子句定义模式的加密默认值。默认情况下,表继承对其创建的架构或常规表空间的加密。加密默认值通过启用table_encryption_privilege_check变量。当使用不同于设置的加密设置创建或更改模式或常规表空间default_table_encryption时,或者当使用不同于默认模式加密的加密设置创建或更改表时,将进行特权检查。启用该TABLE_ENCRYPTION_ADMIN特权后,将允许覆盖默认的加密设置table_encryption_privilege_check。有关更多信息,请参见为架构和常规表空间定义加密默认值。
    • InnoDB增强功能。这些InnoDB增强功能已添加:

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

        • 重新启动服务器不再取消AUTO_INCREMENT = Ntable选项的作用。如果将自动递增计数器初始化为特定值,或者将自动递增计数器值更改为较大的值,则新值将在服务器重新启动后保留。
        • ROLLBACK操作结束后立即重新启动服务器将不再导致分配给回滚事务的自动增量值的重用。
        • 如果将AUTO_INCREMENT列值修改为大于当前最大自动增量值的值(UPDATE例如,在一个操作中),则将保留新值,并且后续INSERT操作将从新的较大值开始分配自动增量值。

        有关更多信息,请参见第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表空间加密功能重做日志和撤销日志数据的支持加密。请参阅重做日志加密和撤消日志加密。
      • InnoDB支持NOWAITSKIP LOCKED选项SELECT ... FOR SHARE以及SELECT ... FOR UPDATE锁定读取语句。NOWAIT如果请求的行被另一个事务锁定,则导致该语句立即返回。SKIP LOCKED从结果集中删除锁定的行。请参阅使用NOWAIT和SKIP LOCKED锁定读取并发。

        SELECT ... FOR SHAREreplaces SELECT ... LOCK IN SHARE MODE,但LOCK IN SHARE MODE仍可用于向后兼容。这些语句是等效的。然而,FOR UPDATEFOR SHARE支持NOWAITSKIP LOCKED和选项。请参见第13.2.10节“ SELECT语句”。OF tbl_name

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

      • ADD PARTITIONDROP PARTITIONCOALESCE PARTITIONREORGANIZE PARTITION,和REBUILD PARTITIONALTER TABLE选项由本地分区就地API的支持,可能与使用ALGORITHM={COPY|INPLACE}LOCK条款。

        DROP PARTITION与一起ALGORITHM=INPLACE删除分区中存储的数据并删除分区。但是,DROP PARTITION使用ALGORITHM=COPYold_alter_table=ON重建分区表,并尝试将数据从删除的分区移动到具有兼容PARTITION ... VALUES定义的另一个分区。无法删除的数据将被删除。

      • InnoDB现在,存储引擎使用MySQL数据字典,而不是其自己的特定于存储引擎的数据字典。有关数据字典的信息,请参见第14章,MySQL数据字典
      • mysql现在,在MySQL数据目录中InnoDB命名的单个表空间文件中创建系统表和数据字典表mysql.ibd。以前,这些表是InnoDBmysql数据库目录中的单个表空间文件中创建的。
      • 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根据服务器上检测到的内存量自动配置以下选项:

        • innodb_buffer_pool_size
        • innodb_log_file_size
        • innodb_flush_method

        该选项适用于在专用服务器上运行的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操作”。
        • 添加或删除虚拟列。
        • 添加或删除列默认值。
        • 修改ENUMSET列的定义。
        • 更改索引类型。
        • 重命名表。

        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 TABLESPACEALTER 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_multiplier MySQL 8.0.16中引入的变量提供了对自旋锁轮询延迟持续时间的更好控制,自旋锁轮询延迟是在线程等待获取互斥量或rw锁时发生的。可以对延迟进行更精细的调整,以解决不同处理器体系结构上PAUSE指令持续时间的差异。有关更多信息,请参见第15.8.8节“配置自旋锁定轮询”。
      • InnoDB在MySQL 8.0.17中,通过更好地利用读取线程,减少了并行扫描期间发生的预取活动的读取线程I / O来改善了大型数据集的并行读取线程性能,并支持了分区的并行扫描。

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

      • innodb_idle_flush_pct MySQL 8.0.18中引入的变量允许限制空闲期间的页面刷新,这可以帮助延长固态存储设备的寿命。请参见在空闲期间限制缓冲区刷新。
      • 增加了对有效采样InnoDB数据的支持,以生成直方图统计数据。请参见直方图统计分析。
    • 字符集支持。默认字符集已从更改latin1utf8mb4。该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列清单,WHEREHAVING条款,并ORDER BYGROUP 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,path COLUMNS column_list)[AS]alias)exprpathcolumn_list

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

        JSON源表达式可以是产生有效JSON文档的任何表达式,包括JSON文字,表列或返回JSON的函数调用,例如JSON_EXTRACT(t1, data,'$.post.comments')。有关更多信息,请参见第12.17.6节“ JSON表函数”。

    • 数据类型支持。 MySQL现在支持将表达式用作数据类型规范中的默认值。这包括使用表达式作为默认值BLOBTEXTGEOMETRY,和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 < 256to WHERE 1(并完全优化该条件)或WHERE c >= 255to WHERE c = 255

        有关更多信息,请参见第8.2.1.14节“恒定折叠优化”。

      • 从MySQL 8.0.16开始,与IN子查询一起使用的半联接优化现在也可以应用于EXISTS子查询。另外,优化器现在WHERE在子查询所附加的条件下对琐碎相关的相等谓词进行解相关,以便可以将它们与子查询中的表达式进行类似的处理IN。这适用于EXISTSIN子查询。

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

      • 在MySQL 8.0.17及更高版本中,WHERE具有或的条件在内部转换为反连接。(antijoin从表中返回所有与表中没有行匹配的行相匹配的行的行。)这将删除子查询,这会导致查询执行更快,因为该子查询的表现在在顶部处理水平。NOT IN(subquery)NOT EXISTS(subquery)

        这类似于并重用现有的IS NULLNot exists)外连接优化。请参阅 EXPLAIN Extra Information。

    • 常用表表达式。 MySQL现在支持通用表表达式,包括非递归和递归的。公用表表达式允许使用命名的临时结果集,该方法通过允许在WITH语句之前的子句SELECT和某些其他语句来实现。有关更多信息,请参见第13.2.15节“ WITH(公用表表达式)”。

      从MySQL 8.0.19开始,SELECT递归公用表表达式(CTE)的递归部分支持LIMIT子句。LIMITOFFSET也支持。有关更多信息,请参见递归公用表表达式。

    • 窗口功能。 MySQL现在支持窗口函数,对于查询的每一行,都使用与该行相关的行来执行计算。这些包括诸如RANK()LAG(),和NTILE()。此外,现在可以将几个现有的聚合函数用作窗口函数(例如SUM()AVG())。有关更多信息,请参见第12.21节“窗口函数”。
    • 横向派生表。现在,派生表之前可以带有LATERAL关键字,以指定允许它引用(取决于)同一FROM子句中的先前表的列。横向派生表使某些SQL操作可能无法通过非横向派生表完成,或者需要效率较低的解决方法。请参见第13.2.11.9节“侧面衍生表”。
    • 单表DELETE语句中的别名。在MySQL 8.0.16和更高版本中,单表DELETE语句支持使用表别名。
    • 正则表达式支持。此前,MySQL的使用的亨利斯宾塞正则表达式库来支持正则表达式运算符(REGEXPRLIKE)。使用Unicode国际组件(ICU)重新实现了对正则表达式的支持,该组件提供了完整的Unicode支持并且是多字节安全的。该REGEXP_LIKE()函数以REGEXPRLIKE运算符的方式执行正则表达式匹配,它们现在是该函数的同义词。此外,REGEXP_INSTR()REGEXP_REPLACE(),和REGEXP_SUBSTR()函数可用于查找匹配位置并分别执行子字符串替换和提取。该regexp_stack_limitregexp_time_limit系统变量提供由发动机匹配了资源消耗的控制。有关更多信息,请参见第12.7.2节“正则表达式”。有关实现更改可能影响使用正则表达式的应用程序的方式的信息,请参见正则表达式兼容性注意事项。
    • 内部临时表。TempTable存储引擎替换MEMORY存储引擎作为默认发动机用于在内存中的内部临时表。该TempTable存储引擎提供了有效的存储VARCHARVARBINARY列。的internal_tmp_mem_storage_engine会话变量定义了用于在存储器内的临时表的存储引擎。允许的值为TempTable(默认值)和MEMORY。该temptable_max_ram变量定义TempTable在将数据存储到磁盘之前存储引擎可以使用的最大内存量。
    • 正在记录。错误记录已重写为使用MySQL组件体系结构。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录则是可加载的组件。此外,还提供了可加载的JSON日志编写器。要控制要启用的日志组件,请使用log_error_services系统变量。有关更多信息,请参见第5.4.2节“错误日志”。
    • 备用锁。一种新型的备份锁允许在联机备份期间使用DML,同时防止可能导致快照不一致的操作。LOCK INSTANCE FOR BACKUPUNLOCK INSTANCE语法支持新的备份锁。该BACKUP_ADMIN权限才能使用这些语句。
    • 复制。对MySQL复制进行了以下增强:

      • MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,从而在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过将新的binlog_row_value_options系统变量设置为来启用PARTIAL_JSON。有关更多信息,请参见JSON值的部分更新以及的描述binlog_row_value_options
    • 连接管理。 MySQL服务器现在允许专门为管理连接配置TCP / IP端口。这提供了用于普通连接的网络接口上允许的单个管理连接的替代方法,即使max_connections已经建立连接也是如此。请参见第8.12.4.1节“ MySQL如何处理客户端连接”。

      MySQL现在提供了对压缩使用的更多控制,以最大程度地减少通过与服务器的连接发送的字节数。以前,给定的连接未压缩或已使用zlib压缩算法。现在,也可以使用该zstd算法,并选择zstd连接的压缩级别。可以在服务器端以及连接原始端配置允许的压缩算法,以通过客户端程序以及参与主/从复制或组复制的服务器进行连接。有关更多信息,请参见第4.2.6节“连接压缩控制”。

    • 组态。在整个MySQL中,主机名的最大允许长度已从以前的60个字符增加到255个ASCII字符。例如,这适用于数据字典中与主机名相关的列,mysql系统架构,性能架构INFORMATION_SCHEMAsys;陈述的MASTER_HOST价值CHANGE MASTER TO;语句输出中的HostSHOW PROCESSLIST;帐户名称中的主机名(例如帐户管理对帐单和DEFINER属性);以及与主机名相关的命令选项和系统变量。

      注意事项:

      • 允许的主机名长度增加会影响在主机名列上具有索引的表。例如,mysql系统架构中索引主机名的表现在具有显式ROW_FORMAT属性,DYNAMIC以容纳更长的索引值。
      • 某些基于文件名的配置设置可能是基于服务器主机名构造的。允许的值受基础操作系统的约束,该操作系统可能不允许文件名足够长以包含255个字符的主机名。这会影响到general_log_filelog_errorpid_filerelay_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.6.11节“ C API异步接口”。
    • 演员表的其他目标类型。功能CAST()CONVERT()现在支持转换到类型DOUBLEFLOATREAL。在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(expression AS type ARRAY)允许通过将在JSON文档中找到的JSON数组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_JOINNO_HASH_JOIN优化程序提示来控制哈希联接的使用。

      哈希联接可用的内存量受的值限制join_buffer_size。在磁盘上执行需要更多内存的哈希联接;磁盘上的哈希联接可以使用的磁盘文件数受限制open_files_limit

      有关更多信息和示例,请参见第8.2.1.4节“哈希联接优化”。

      从MySQL 8.0.19开始,MySQL 8.0.18中hash_join引入的优化器开关不再起作用。这也适用于HASH_JOINNO_HASH_JOIN优化器提示。开关和提示现在都已弃用,并将在将来的MySQL版本中删除。

    • 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早期版本的向后兼容性。

      现在这样的隐式转换的时间类型(之间执行DATEDATETIMETIMESTAMPTIME)和数字类型(SMALLINTTINYINTMEDIUMINTINT/INTEGERBIGINT;DECIMAL/NUMERIC;FLOATDOUBLEREALBIT),只要他们正在使用任何标准的数字比较运算符(相较=>=><<=<>/!=,要么<=>)。在这种情况下,任何尚未为a的值DOUBLE都将强制转换为1。现在也执行强制转换注入,以比较DATETIME值与DATETIME值,其中,在必要时将参数强制转换为DATETIME

      因此能够看到通过参见的输出时石膏注入到一个给定的查询EXPLAIN ANALYZEEXPLAIN 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(TIMESTAMPDATETIME)值的时区偏移量。该偏移量使用与设置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.13节“ MySQL服务器时区支持”以及第11.2.2节“ DATE,DATETIME和TIMESTAMP类型”。

    • 有关JSON模式CHECK约束失败的精确信息。JSON_SCHEMA_VALID()用于指定CHECK约束时,MySQL 8.0.19和更高版本提供有关此类约束失败原因的准确信息。

      有关示例和更多信息,请参见 JSON_SCHEMA_VALID()和CHECK约束。另请参见第13.1.20.7节“检查约束”。

    • 行和列别名具有ON DUPLICATE KEY UPDATE。从MySQL 8.0.19开始,可以使用别名引用要插入的行,以及(可选)引用其列。考虑在具有列和INSERT的表t上的以下语句:ab

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

      使用new新行的别名,在某些情况下,使用别名mn该行的列,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 ),但不允许选择单个表列。可以在您使用等效语句的任何地方使用;这包括连接,联合,,,语句和子查询。例如:TABLE table_nameSELECT * FROM table_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可用于一个表值提供给一个INSERTREPLACESELECT语句,和由的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和其使用的示例,请参阅本文档的以下部分:

      • 第13.2.12节“ TABLE语句”
      • 第13.2.14节“ VALUES语句”
      • 第13.1.20.5节“ CREATE TABLE ... SELECT语句”
      • 第13.2.6.1节“ INSERT ... SELECT语句”
      • 第13.2.10.2节“ JOIN子句”
      • 第13.2.11节“子查询”
      • 第13.2.10.3节“ UNION子句”

    MySQL 8.0中不推荐使用的功能

    以下功能在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_LENGTH SQL模式已经过时了。
    • AUTO_INCREMENT不支持类型FLOATDOUBLE(以及任何同义词)的列。考虑AUTO_INCREMENT从此类列中删除属性,或将其转换为整数类型。
    • UNSIGNED属性被弃用类型的列FLOATDOUBLEDECIMAL(和任何同义词)。考虑CHECK对此类列使用简单约束。
    • FLOAT(M,D)和语法指定的位数类型的列的数目和(和任何同义词)是一个非标准MySQL扩展。不建议使用此语法。DOUBLE(M,D)FLOATDOUBLE
    • ZEROFILL对于数字数据类型,不建议使用该属性,对于整数数据类型,则不建议使用显示宽度属性。考虑使用替代方法来产生这些属性的效果。例如,应用程序可以使用该LPAD()功能对数字进行零填充以达到所需的宽度,或者可以将格式化的数字存储在CHAR列中。
    • 对于字符串数据类型,该BINARY属性是非标准的MySQL扩展,它是用于指定_bin列字符集(如果未指定列字符集,则为表默认字符集)的二进制()归类的简写形式。在MySQL 8.0中,这种非标准用法BINARY是不明确的,因为utf8mb4字符集具有多个_bin排序规则,因此BINARY不赞成使用该属性,并且在将来的MySQL版本中将删除对该属性的支持。应将应用程序调整为使用显式_bin排序规则。

      BINARY用于指定数据类型或字符集的用法保持不变。

    • 非标准C风格&&||!运营商认为是标准的SQL同义词ANDORNOT运营商,分别已被取消。使用非标准运算符的应用程序应调整为使用标准运算符。

      注意

      使用的||,除非被弃用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_tableand TABLESPACE = innodb_temporary子句CREATE TEMPORARY TABLE
    • 对于SELECT报表,使用的INTO条款之后,FROM而不是在的结尾SELECT被弃用的MySQL 8.0.20的。最好将放在INTO语句的末尾。

      对于UNION语句,INTO从MySQL 8.0.20开始不推荐使用这两个包含的变体:

      • 在查询表达式的结尾查询块中,使用INTObefore FROM
      • 在查询表达式的带括号的尾随块中,请使用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 ERRORON EMPTY调用时指定before 违反JSON_TABLE()了SQL标准,所以现在在MySQL中不推荐使用此语法。从MySQL 8.0.20开始,每当您尝试这样做时,服务器都会打印警告。在单个JSON_TABLE()调用中指定这两个子句时,请确保ON EMPTY首先使用该子句。

    MySQL 8.0中删除的功能

    以下各项已过时,并且已在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_COLUMNS
      INNODB_SYS_DATAFILESINNODB_DATAFILES
      INNODB_SYS_FIELDSINNODB_FIELDS
      INNODB_SYS_FOREIGNINNODB_FOREIGN
      INNODB_SYS_FOREIGN_COLSINNODB_FOREIGN_COLS
      INNODB_SYS_INDEXESINNODB_INDEXES
      INNODB_SYS_TABLESINNODB_TABLES
      INNODB_SYS_TABLESPACESINNODB_TABLESPACES
      INNODB_SYS_TABLESTATSINNODB_TABLESTATS
      INNODB_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 WITH auth_plugin AS '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 CACHERESET QUERY CACHE语句。
      • 这些系统变量:query_cache_limitquery_cache_min_res_unitquery_cache_sizequery_cache_typequery_cache_wlock_invalidate
      • 这些状态变量:Qcache_free_blocksQcache_free_memoryQcache_hitsQcache_insertsQcache_lowmem_prunesQcache_not_cachedQcache_queries_in_cacheQcache_total_blocks
      • 这些线程状态:checking privileges on cached querychecking query cache for queryinvalidating query cache entriessending cached result to clientstoring result in query cacheWaiting for query cache lock
      • SQL_CACHESELECT修改。

      这些不赞成使用的查询缓存项仍然不赞成使用,但没有效果,将在以后的MySQL版本中删除:

      • SQL_NO_CACHESELECT修饰符。
      • ndb_cache_check_time系统变量。

      have_query_cache系统变量保持过时,总有一个价值NO,并会在将来的MySQL版本中删除。

    • 数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名称以查找数据库。因此,--ignore-db-dir选项和ignore_db_dirs系统变量是多余的并被删除。
    • tx_isolationtx_read_only系统变量已被删除。使用transaction_isolationtransaction_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_sizemetadata_locks_hash_instances系统变量被删除。
    • 未使用date_formatdatetime_formattime_format,和max_tmp_tables系统变量被删除。
    • 这些弃用兼容性SQL模式被移除:DB2MAXDBMSSQLMYSQL323MYSQL40ORACLEPOSTGRESQLNO_FIELD_OPTIONSNO_KEY_OPTIONSNO_TABLE_OPTIONS。它们不能再分配给sql_mode系统变量或用作mysqldump--compatible选项的允许值。

      删除MAXDB意味着将或的TIMESTAMP数据类型视为,而不再视为。CREATE TABLEALTER TABLETIMESTAMPDATETIME

    • 子句的不推荐使用ASCDESC限定符将GROUP BY被删除。先前依赖于GROUP BY排序的查询所产生的结果可能与以前的MySQL版本不同。要产生给定的排序顺序,请提供一个ORDER BY子句。
    • 该语句的EXTENDEDPARTITIONS关键字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 DATASELECT ... 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_REQUIREDSSL_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存储引擎提供本机分区支持:InnoDBNDB。其中,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 TABLESTORAGE ENGINE选项使用非值的语句中删除对分区的所有引用InnoDB
      • 将存储引擎指定为InnoDB,或者InnoDB默认情况下允许用作表的存储引擎。

      有关更多信息,请参见第23.6.2节“与存储引擎有关的分区限制”。

    • 系统和状态变量信息不再保存在中INFORMATION_SCHEMA。这些表被删除:GLOBAL_VARIABLESSESSION_VARIABLESGLOBAL_STATUSSESSION_STATUS。请改用相应的性能架构表。请参见第26.12.13节“性能模式系统变量表”和第26.12.14节“性能模式状态变量表”。另外,show_compatibility_56系统变量也被删除。它用于过渡期间,在此期间,系统和状态变量信息INFORMATION_SCHEMA表已移至Performance Schema表,并且不再需要。这些状态变量被删除:Slave_heartbeat_periodSlave_last_heartbeatSlave_received_heartbeatsSlave_retried_transactionsSlave_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_SERVERWITH_EMBEDDED_SHARED_LIBRARYINSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR选项
      • (未记录)mysql--server-arg选项
      • mysqltest--embedded-server--server-arg--server-file选项
      • mysqltest_embeddedmysql_client_test_embedded测试程序
    • mysql_plugin移除工具。替代方法包括在服务器启动时使用--plugin-load--plugin-load-add选项或在运行时使用该INSTALL PLUGIN语句加载插件。
    • 的resolveip工具被删除。可以改用nslookuphostdig
    • 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_locksdata_lock_waits表。

      注意

      在MySQL 5.7中,LOCK_TABLE在列INNODB_LOCKS表和locked_table在列sys模式innodb_lock_waitsx$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=COMPRESSEDKEY_BLOCK_SIZE指定的。如果innodb_strict_mode禁用此选项,则会发出警告,并使用非压缩的行格式创建临时表。
    • InnoDB在MySQL数据目录之外创建表空间数据文件时,不再创建.isl文件(InnoDB符号链接文件)。innodb_directories现在,该选件支持查找在数据目录外部创建的表空间文件。

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

    • 以下InnoDB文件格式变量已删除:

      • innodb_file_format
      • innodb_file_format_check
      • innodb_file_format_max
      • innodb_large_prefix

      文件格式变量对于创建与InnoDBMySQL 5.1 早期版本兼容的表是必需的。现在,MySQL 5.1的产品生命周期已经结束,不再需要这些选项。

      FILE_FORMAT列已从INNODB_TABLESINNODB_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