MySQL8.0更新的内容

  官网地址:MySQL :: MySQL 8.0 Reference Manual :: 1.3 What Is New in MySQL 8.0

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

Mysql8.0参考手册  /  一般信息  /什么是在mysql8.0的新内容

1.3如何在mysql中是新的

本节总结了从mysq8.0中添加、反对和删除的内容。相关部分列出了在mysql8.0中添加、反对或删除的mysql服务器选项和变量; 1.4节,"在mysql8.0中添加、反对或删除的服务器和状态变量和选项" .

  • 添加在mysql8.0中的特征

  • 在mysql8.0中被弃用的特征

  • 在mysql8.0中删除的特征

添加在mysql8.0中的特征

在mysql8.0中增加了以下功能:

  • 数据字典。  Mysql现在包含了一个事务数据字典,存储有关数据库对象的信息。在以前的mysql版本中,字典数据存储在元数据文件和非事务表中。详情请参阅 Chapter 14, Mysql数据字典 .

  • 原子数据定义语句(原子DDL)。  原子DDL语句将数据字典更新、存储引擎操作和与DDL操作相关的二进制日志写入一个原子事务。详情请参阅 第13.1.1节,"原子数据定义说明支持" .

  • 升级程序。  以前,在安装了新版本的mysql之后,mysql服务器在下一次启动时会自动升级数据字典表,之后DBA将会调用数据字典表。 Mysql_升级的 手动更新系统表 mysql 以及其他模式中的对象,例如sys 架构和用户架构。

    截至mysql8.0.16,服务器执行先前由 Mysql_升级的 .在安装了新的mysql版本后,服务器现在在下一个启动时自动执行所有必要的升级任务,不依赖调用DBA Mysql_升级的 .此外,服务器更新了帮助表的内容( Mysql_升级的 没有)。全新的 --upgrade 服务器选项提供了对服务器如何执行自动数据字典和服务器升级操作的控制。详情请参阅 第2.10.3节,"mysql升级过程的升级内容".

  • 会话重用。  Mysql服务器现在默认情况下支持SSL会话重用,并设置了超时设置,以控制服务器维护会话缓存的时间,该会话缓存将建立一个允许客户机请求新连接的会话重用的时间段。所有mysql客户端程序都支持会话重用。有关服务器端和客户端配置信息,请参阅 第6.3.5节,"重复使用SSL会话" .

    此外,C应用程序现在可以使用CAPI功能来为加密连接启用会话重用(参见 SSL会话重用 ).

  • 安全和账户管理。  这些改进是为了提高安全性,并在账户管理方面增加DBA的灵活性:

    • Mysql企业审计现在支持使用 安排者 组件来配置和执行一个循环的任务来冲洗内存中的缓存。有关安装说明,请参阅 启用审计日志冲冲任务 .

    • 新的密码验证系统变量允许配置和强制执行用户在试图替换自己的mysql帐户密码时必须更改的最低数量的字符。这个新的验证设置是当前密码中字符总数的一个百分比。例如,如果 validate_password.changed_characters_percentage 值为50的,替换帐户密码中至少一半的字符不得出现在当前的密码中,否则密码被拒绝。详情请参阅 第6.4.3节,"密码验证组件" .

    • Mysql企业版现在提供基于组件的数据掩蔽和去识别功能,而不是基于在mysq8.0.13中引入的插件库。mysql企业数据掩蔽和去识别组件支持多字节字符、存储在数据库表中的掩蔽字典和几个新功能。详情请参阅 第6.5.1节,"数据掩蔽组件与数据掩蔽插件" .

    • 在我的系统8.0.33之前,mysql 系统数据库被用于mysql企业审计的过滤器和用户帐户数据的持续存储。为了提高灵活性, audit_log_database 服务器系统变量现在允许在服务器启动时在全局架构命名空间中指定其他数据库。…mysql 系统数据库是表存储的默认设置.

    • 资助表载於mysql 系统数据库现在InnoDB (事务)以前,这些是 MyISAM (非事务性)表格。赠款表存储引擎的改变是伴随着会计管理报表行为的改变的基础。会计管理报表(例如: CREATE USER 或 DROP USER 对某些用户来说,指定多个用户可能是成功的,而对其他用户则是失败的。现在,每个语句都是事务性的,或者为所有指定的用户成功,或者回滚,如果发生任何错误,则没有效果。如果语句成功了,将写入二进制日志,但是如果失败了,则不会写入;在这种情况下,将会发生回滚,不会进行更改。详情请参阅 第13.1.1节,"原子数据定义说明支持" .

    • 全新的caching_sha2_password 可使用认证插件。喜欢 sha256_password 普卢金, caching_sha2_password 实现SA-256密码哈希,但使用缓存在连接时解决延迟问题。它还支持更多的传输协议,并且不需要针对基于RSA密钥的密码交换功能进行链接。看 第6.4.1.2节,"缓存Sha2-可插入认证" .

      caching_sha2_password 和 sha256_password 认证插件提供的安全密码加密比 mysql_native_password 普金(在8.0.34中反对),和 caching_sha2_password 比…更好的表现sha256_password .因为这些优越的安全和性能特征 caching_sha2_password ,它现在是首选的身份验证插件,也是默认的身份验证插件,而不是 mysql_native_password .有关此默认插件更改对服务器操作及服务器与客户端和连接器兼容性的影响,请参阅 作为首选身份验证插件的密码 .

    • mysql企业版SSAAP身份验证插件现在支持GSSASI/Kerberos作为一个认证方法,用于在Linux上的mysql客户端和服务器。这在使用微软主动目录访问LDAP的Linux环境中是有用的,该目录在默认情况下启用了Kerberos。看 LDAP认证方法 .

    • Mysql企业版现在支持一种身份验证方法,这种方法允许用户使用Kerberos对mysql服务器进行身份验证,前提是可以获得或可以获得适当的Kerberos票。详情请参阅 第6.4.1.8节,"可插入认证" .

    • Mysql现在支持角色,这些角色被命名为特权集合。角色可以创建和删除。角色可以享有授予和取消的特权。角色可以授予用户帐户并从用户帐户中撤销。一个账户的有效适用角色可以从授予该账户的角色中选择,也可以在该账户的会话期间更改。详情请参阅 第6.2.10节,"发挥作用" .

    • Mysql现在纳入了用户帐户类别的概念,根据系统和普通用户是否有 SYSTEM_USER 特权。看 第6.2.11节,"帐户类别" .

    • 以前,除了某些模式之外,不可能授予全局应用的权限。如果现在可以 partial_revokes 系统变量启用.看 第6.2.12节,"部分撤销的特权限制" .

    • …GRANT 声明有一个 指定用于语句执行的特权上下文的附加信息的条款。这种语法在SQL级别上是可见的,尽管其主要目的是通过使这些限制出现在二进制日志中,使部分撤销所施加的设保人特权限制的所有节点能够统一复制。看 第13.7.1.6节,"赠款报表" . AS user [WITH ROLE]

    • Mysql现在维护有关密码历史的信息,允许对以前密码的重用施加限制。DBA可以要求在一定数量的密码更改或时间段内,不从以前的密码中选择新的密码。可以在全球和每个帐户的基础上建立密码重用政策。

      现在有可能要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使DBA能够防止用户更改密码,而不必证明他们知道当前的密码。可以在全球和每个账户的基础上制定密码核实政策。

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

      Mysql现在允许管理员配置用户帐户,这样,由于密码错误而导致的连续登录失败过多将导致临时帐户锁定。所需的故障数量和锁定时间是可配置的每个帐户。

      这些新功能为DBA提供了对密码管理的更完整的控制。详情请参阅 第6.2.15节,"密码管理" .

    • 如果使用开放SSL进行编译,那么MysQL现在支持FIS模式,并且在运行时可以使用一个开放SSL库和一个开放SSL对象模块。FIP模式对加密操作施加了条件,例如限制可接受的加密算法或对较长密钥长度的要求。看 Section 6.8, “FIPS Support” .

    • 服务器现在用于新连接的TLS上下文在运行时是可重构的。例如,这个功能可能是有用的,以避免重新启动一个已经运行了太长时间,其SSL证书已经过期的mysql服务器。看 服务器端运行时配置和加密连接监控 .

    • 如果服务器和客户端都使用开放SSL1.1.1.1支持TLSV1.3加密连接协议,则支持mysq8.0.16和更高支持TLSV1.3。看 第6.3.2节,"加密连接TLS协议和密码" .

    • Mysql现在将授予指定管道上的客户端的访问控制设置到窗口上成功通信所需的最小值。更新的mysql客户端软件可以打开命名的管道连接,而无需任何附加配置。如果旧客户机软件不能立即升级,新的 named_pipe_full_access_group 系统变量可以用来授予Windows组打开指定管道连接的必要权限。充分进入小组的成员资格应受到限制,并应是临时的。

    • 以前,mysql用户帐户使用单一身份验证方法对服务器进行身份验证。对于mysql8.0.27,mysql支持多因素身份验证(MFA),这使得创建具有最多三种身份验证方法的帐户成为可能。外交部的支助需要这些改变:

      • CREATE USER 和 ALTER USER 语法已经扩展到允许规范多种认证方法。

      • … authentication_policy 系统变量通过控制可以使用多少因素和每个因素允许的身份验证类型来建立MFA策略。这就限制了与认证有关的条款 CREATE USER 和 ALTER USER 可以使用语句。

      • 客户程序有新的 --password1 , --password2 ,以及 --password3 指定多个密码的命令行选项。对于使用CAPI的应用程序,新的MYSQL_OPT_USER_PASSWORD 备选办法 mysql_options4() CAPI函数支持相同的功能.

      此外,mysql企业版现在支持使用智能卡、安全密钥和生物鉴别读取器等设备对mysql服务器进行身份验证。这个认证方法是基于快速在线标识(FIDO)标准,并使用一对插件, authentication_fido 在服务器端authentication_fido_client 客户那边。服务器端FIDO认证插件仅包括在mysql企业版发行版中。它不包括在mysql社区分布中。然而,包括社区分布在内的所有分布都包含了客户端插件。这使来自任何分发的客户端能够连接到一个服务器端插件已加载的服务器。

      多因素身份验证可以使用现有的mysql身份验证方法、新的FIDO身份验证方法或两者的组合。详情请参阅 第6.2.18节,"多因素认证" ,以及 第6.4.1.11节,"FIDO可插入认证" .

  • 资源管理。  Mysql现在支持创建和管理资源组,并允许将在服务器中运行的线程分配给特定组,以便线程根据该组可用的资源执行。组属性启用对其资源的控制,以启用或限制组中线程的资源消耗。DBA可以根据不同的工作负载修改这些属性。目前,CPU时间是一种可管理的资源,表现为 “ 虚拟CPU ” 包括CPU核心、超线程、硬件线程等。服务器在启动时决定有多少虚拟CPU可用,具有适当权限的数据库管理员可以将这些CPU与资源组联系起来,并将线程分配给组。详情请参阅 第5.1.16节,"资源组" .

  • 表加密管理。  现在可以通过定义和强制执行加密默认值来全面管理表加密。… default_table_encryption 变量定义了新创建的模式和一般表空间的加密默认值。模式的默认加密也可以使用DEFAULT ENCRYPTION 在创建架构时使用。默认情况下,表继承在其中创建的模式或一般表空间的加密。通过启用 table_encryption_privilege_check 变量。当创建或更改与加密设置不同的模式或一般表空间时,将进行权限检查。 default_table_encryption 设置,或使用不同于默认模式加密的加密设置创建或更改表时。… TABLE_ENCRYPTION_ADMIN 特权允许推翻默认加密设置 table_encryption_privilege_check 已经启用。详情请参阅 定义模式和通用表空间的加密默认值 .

  • 因诺布增强。  这些InnoDB 增加了改进:

    • 当前的最大自动增量计数器值被写入到每次值变化的重做日志中,并保存到每个检查点上的发动机私有系统表中。这些更改使得当前的最大自动增量计数器值在服务器之间持久地重新启动。此外:

      • 服务器重新启动不再取消 AUTO_INCREMENT = N 表选项。如果将自动增加计数器初始化为特定值,或者将自动增加计数器值更改为更大值,则新值在服务器重新启动时会持续存在。

      • 在一个 ROLLBACK 操作不再会导致重新使用分配给滚动的回程事务的自动递增值。

      • 如果你修改了AUTO_INCREMENT 列值为大于当前最大自动递增值的值 UPDATE (例如,操作),新的值将被持久化,并随后进行 INSERT 从新的大值开始分配自动递增值。

      详情请参阅 15.6.1.6节,"在印度的自动增加处理" ,以及 自增加计数器初始化 .

    • 当遇到索引树腐败时, InnoDB 在重做日志中写入腐败标志,这使腐败标志安全崩溃。InnoDB 还在每个检查点的引擎私有系统表中写入内存腐败标记数据。在恢复过程中, InnoDB 在将内存表和索引对象标记为腐败之前,从两个位置读取腐败标记并合并结果。

    • InnoDB 记忆的 插入支持多重 get 操作(在一个单一的键值对中获取多个键值对 记忆的 查询和范围查询。看 15.20.4节,"因诺杜布记忆多重获取和范围查询支持" .

    • 新的动态变量, innodb_deadlock_detect ,可用于禁用死锁检测。在高并发系统上,当多个线程等待相同的锁时,死锁检测会导致减速。有时,禁用死锁检测和依靠 innodb_lock_wait_timeout 当出现死锁时设置事务回滚。

    • 新的信息模式 INNODB_CACHED_INDEXES 表中报告在 InnoDB 每个索引的缓冲池。

    • InnoDB 现在在共享的临时表空间中创建了临时表, ibtmp1 .

    • InnoDB 平板空间加密功能 支持重做日志和撤销日志数据的加密。看 重做日志加密 ,以及 卸载日志加密 .

    • InnoDB 支持 NOWAIT 和SKIP LOCKED 选择SELECT ... FOR SHARE 和SELECT ... FOR UPDATE 锁定读声明。 NOWAIT 如果请求的行被另一个事务锁定,则使语句立即返回。SKIP LOCKED 从结果集中移除锁定的行。看 锁读并发与诺等等和跳闸锁定 .

      SELECT ... FOR SHARE 替换 SELECT ... LOCK IN SHARE MODE ,但是 LOCK IN SHARE MODE 用于向后兼容的剩余。这些报表是相等的。不过,FOR UPDATE 和 FOR SHARE 支持 NOWAIT ,SKIP LOCKED ,以及 各种选择。看 13.2.13节,"选定陈述" . OF tbl_name

      OF tbl_name将查询锁定到命名表的应用程序。

    • ADD PARTITION ,DROP PARTITION ,COALESCE PARTITION ,REORGANIZE PARTITION ,以及REBUILD PARTITION ALTER TABLE 选项由本地分区的API支持,可以使用 ALGORITHM={COPY|INPLACE} 和 LOCK 条款。

      DROP PARTITION 与…有关 ALGORITHM=INPLACE 删除存储在分区中的数据并删除分区.不过, DROP PARTITION 与…有关 ALGORITHM=COPY 或 old_alter_table=ON 重新构建分区表并尝试使用兼容的数据从删除的分区转移到另一个分区PARTITION ... VALUES 定义。不能移动到另一个分区的数据被删除。

    • InnoDB 存储引擎现在使用的是mysql数据字典,而不是自己的存储引擎专用数据字典。有关数据字典的资料,请参阅 Chapter 14, Mysql数据字典 .

    • mysql 系统表和数据字典表现在在一个单一的系统中创建 InnoDB 表空间文件命名 mysql.ibd 在mysql数据目录中。以前,这些表格是以个人形式创建的InnoDB 表格空间文件在mysql 数据库目录。

    • 在mysql8.0中介绍了以下撤销表空间更改:

      • 默认情况下,撤销日志现在保存在两个撤销表空间中,这些空间是在初始化mysql实例时创建的。在系统表空间中不再创建撤销日志。

      • 对于mysql8.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};

        ASTATE 在信息模式中添加了显示表空间状态的列 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 默认设置反映了从基于状态的复制到作为mysql5.7中默认复制类型的基于行的复制的更改。基于声明的复制需要连续的自动递增锁定模式(以前的默认),以确保在给定的SQL语句序列中以可预测和可重复的顺序分配自动递增值,而基于行的复制对SQL语句的执行顺序不敏感。详情请参阅 自增锁定模式 .

      对于使用基于声明的复制的系统, innodb_autoinc_lock_mode 默认设置可能会破坏依赖顺序自动增量值的应用程序。要恢复先前的默认值,设置 innodb_autoinc_lock_mode to 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服务器启用自动配置" .

    • 新的信息模式 INNODB_TABLESPACES_BRIEF 视图提供空间、名称、路径、标记和空间类型数据InnoDB 平板空间。

    • … 扎利布图书馆 与mysql捆绑的版本从1.2.3版本提高到1.2.11版本。mysql是在兹利布库的帮助下实现压缩的。

      如果你用InnoDB 压缩桌,见 Section 2.10.4, “Changes in MySQL 8.0” 相关的升级影响。

    • 序列化字典信息(SDI)在所有字典中都存在。InnoDB 除了全局临时表空间和撤销表空间文件以外的表空间文件。SDI是表和表空间对象的序列化元数据。SDI数据的存在提供了元数据冗余。例如,如果数据字典不可用,可以从表空间文件中提取字典对象元数据。SDI提取是使用 Ibd2sdi 工具。SDI数据存储在JSON 格式。

      在表空间文件中包含SDI数据会增加表空间文件的大小。SDI记录需要一个索引页面,默认情况下它的大小为16kb。然而,当存储SDI数据时会进行压缩,以减少存储足迹。

    • InnoDB 存储引擎现在支持原子DDL,它确保DDL操作要么是完全提交的,要么是回滚的,即使服务器在操作期间停止。详情请参阅 第13.1.1节,"原子数据定义说明支持" .

    • 当服务器脱机时,可以使用 innodb_directories 选择。详情请参阅 15.6.3.6节,"服务器脱机时移动表空间文件" .

    • 实施了下列重做日志优化:

      • 用户线程现在可以并发地写入日志缓冲区而不同步写入。

      • 用户线程现在可以按照一个轻松的顺序将脏页面添加到同花列表中。

      • 一个专用的日志线程现在负责将日志缓冲区写入系统缓冲区,将系统缓冲区冲洗到磁盘,通知用户线程写入和刷新重做,维护放松的冲水列表顺序所需的延迟,以及写入检查点。

      • 添加了系统变量,以配置用户线程的使用旋转延迟等待冲重做:

        • innodb_log_wait_for_flush_spin_hwm定义了用户线程在等待重新执行时不再旋转的最大日志冲洗时间。

        • innodb_log_spin_cpu_abs_lwm定义CPU使用量的最小值,在此下,当等待重新执行时,用户线程不再旋转。

        • innodb_log_spin_cpu_pct_hwm定义最大的CPU使用量,在此之前,用户线程在等待重新执行时不再旋转。

      • … innodb_log_buffer_size 变量现在是动态的,它允许在服务器运行时调整日志缓冲区的大小。

      详情请参阅 8.5.4节,"优化因诺布重做测井" .

    • 对于mysql8.0.12,对于对大型对象(LOB)数据的小更新,支持撤销日志记录,这提高了规模小于100字节的LOB更新的性能。以前,LOB更新至少是一个LOB页面的大小,对于可能只修改几个字节的更新来说,这不是最优的。此增强基于mysq8.4.4中为部分更新LOB数据添加的支持。

    • 从我的8.0.12开始,ALGORITHM=INSTANT 得到以下方面的支持: ALTER TABLE 业务:

      • 加一列。这个特征也被称为 “ 即时的ADD COLUMN ” .适用限制。看 Section 15.12.1, “Online DDL Operations” .

      • 添加或删除一个虚拟列。

      • 添加或删除列默认值。

      • 修改对 ENUM 或 SET 圆柱。

      • 更改索引类型。

      • 换一张桌子。

      支持的业务 ALGORITHM=INSTANT 仅在数据字典中修改元数据。表上没有元数据锁,表数据不受影响,因此操作是即时的。如果没有明确说明,ALGORITHM=INSTANT 默认情况下由支持它的操作使用。如果 ALGORITHM=INSTANT 指定但不支持,操作会立即发生错误。

      欲了解更多有关支持业务的信息 ALGORITHM=INSTANT ,看 Section 15.12.1, “Online DDL Operations” .

    • 我的数据是8.0.13TempTable 存储引擎支持存储二进制大对象(BLOB)类型列。此增强提高了使用含有BLOB数据的临时表的查询的性能。以前,包含BLOB数据的临时表存储在 internal_tmp_disk_storage_engine .详情请参阅 第8.4.4节,"mysql中的内部临时表使用" .

    • 我的数据是8.0.13InnoDB 数据休息加密功能支持通用表空间。以前,只能对每个表表空间文件进行加密。支持普通表空间的加密,CREATE TABLESPACE 和ALTER TABLESPACE 语法扩展到包括 ENCRYPTION 条款。

      信息模式 INNODB_TABLESPACES 表格现包括ENCRYPTION 表示表空间是否加密的列。

      stage/innodb/alter tablespace (encryption) 增加了性能模式阶段仪器,以允许监测一般表空间加密操作。

    • 使残疾 innodb_buffer_pool_in_core_file 变量通过排除核心文件的大小 InnoDB 缓冲池页面。使用这个变量core_file 必须启用变量,操作系统必须支持MADV_DONTDUMP 延长至madvise() ,这是支持在Linux3.4和以后。详情请参阅 第15.8.3.7节,"不包括核心文件中的缓冲池页面" .

    • 对于mysql8.0.13,用户创建的临时表和优化器创建的内部临时表存储在从临时表空间池中分配给会话的会话临时表空间中。当会话断开时,它的临时表空间被截断并释放回池。在以前的版本中,在全球临时表空间中创建了临时表(ibtmp1 ),在删除临时表后,没有将磁盘空间返回操作系统。

      … innodb_temp_tablespaces_dir 变量定义创建会话临时表空间的位置.默认位置是 #innodb_temp 数据目录中的目录。

      … INNODB_SESSION_TEMP_TABLESPACES 表提供了有关会话临时表空间的元数据。

      全球临时表空间(ibtmp1 )现在存储回滚段,以便对用户创建的临时表进行更改。

    • 截至我的数据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 创建表空间的特权。ACREATE TABLESPACE 没有 ADD DATAFILE 该条款隐式地创建具有唯一文件名的表空间数据文件。

    • 默认情况下,当可调用存储引擎占用的内存量超过了 temptable_max_ram 可变的,可调用存储引擎开始从磁盘中分配被内存映射的临时文件。截至mysql8.0.16,这种行为受 temptable_use_mmap 变量。使残废 temptable_use_mmap 使可诱惑存储引擎使用 InnoDB 在磁盘上使用内部临时表代替内存映射文件作为其溢出机制。详情请参阅 内部临时表存储引擎 .

    • 截至我的数据8.0.16,InnoDB 数据休息加密功能支持mysql 系统表空间。… mysql 系统表空间包括 mysql 系统数据库和mysql数据字典表。详情请参阅 第15.13节,"因诺布数据休息加密" .

    • … innodb_spin_wait_pause_multiplier 在mysql8.0.16中引入了变量,提供了对线程等待获取互斥体或rw锁时发生的旋转锁轮询延迟持续时间的更大控制。可以更仔细地调整延迟,以考虑到不同处理器架构中暂停指令持续时间的差异。详情请参阅 15.8.8节,"配置旋转锁投票" .

    • InnoDB通过更好地利用读线程,减少在并行扫描中发生的读线程I/O预取活动,以及支持对分区进行并行扫描,大型数据集的并行读线程性能得到了改进。

      平行读线程特性由 innodb_parallel_read_threads 变量。现在最大设置是256,这是所有客户机连接的线程总数。如果线程限制达到了,连接将返回到使用单个线程。

    • … innodb_idle_flush_pct 在mysq8.0.18中引入了变量,允许在闲置期间限制页面冲洗,这有助于延长固态存储设备的寿命。看 限制闲置期间的缓冲冲水 .

    • 有效抽样InnoDB 用于生成直方图统计数据的数据支持到mysq8.0.19。看 直方图统计分析 .

    • 与mysql8.20.20相比,双写缓冲区存储在双写文件中。在以前的版本中,存储区域位于系统表空间中。将存储区域移出系统表空间可以减少编写延迟,增加吞吐量,并在放置双写缓冲页方面提供灵活性。介绍了高级双写缓冲区配置的下列系统变量:

      • innodb_doublewrite_dir

        定义双写缓冲区文件目录。

      • innodb_doublewrite_files

        定义双写文件的数量。

      • innodb_doublewrite_pages

        定义批处理中每个线程的双写页的最大数量。

      • innodb_doublewrite_batch_size

        定义批处理中的双写页的数量。

      详情请参阅 15.6.4节,"双写缓冲区" .

    • 在mysq8.20.20中改进了以等待锁的事务为优先的内容感知事务调度算法。事务调度权重计算现在完全执行单独的线程,这提高了计算性能和精度。

      第一个先入先出(FIFO)算法被删除,该算法也用于事务调度。FIFO算法由于CAT算法的增强而变得多余.以前由FIFO算法执行的事务调度现在由CAT算法执行。

      ATRX_SCHEDULE_WEIGHT 列被添加到 INFORMATION_SCHEMA.INNODB_TRX 表,它允许查询事务调度权分配的猫算法.

      以下内容INNODB_METRICS 增加了用于监测代码级事务调度事件的计数器:

      • lock_rec_release_attempts

        尝试释放记录锁的次数。

      • lock_rec_grant_attempts

        尝试授予锁的次数记录在案。

      • lock_schedule_refreshes

        分析了等待图更新事务时间表权重的次数。

      详情请参阅 第15.7.6节,"交易时间安排" .

    • 对于需要访问表和行资源锁定队列的操作,为了改进并发性,锁系统互斥(lock_sys->mutex )已被分叉的插销所取代,锁队列被分组成表和页 锁队列碎片 ,每个碎片都有一个专用的互斥体保护。以前,单锁系统互斥保护所有锁队列,这是高并发系统上的一个争论点。新的切分实现允许对锁队列进行更细的访问。

      锁系统互斥(lock_sys->mutex )已由下列"割缝"取代:

      • 全局门闩(lock_sys->latches.global_latch )包括64个读写锁对象(rw_lock_t )。对单个锁队列的访问需要共享全局锁存和锁存队列碎片上的锁存。需要访问所有锁队列的操作采用一个独家全局锁存,它锁定所有表和页锁队列的碎片。

      • 表片锁(lock_sys->latches.table_shards.mutexes ),作为512个互斥器的数组实现,每个互斥器专用于512个表锁队列碎片中的一个。

      • 页片锁(lock_sys->latches.page_shards.mutexes ),作为512个互斥器的数组实现,每个互斥器专用于512个页面锁定队列碎片中的一个。

      性能架构 wait/synch/mutex/innodb/lock_mutex 用于监测单一锁系统互斥的仪器被用于监测新的全局、表碎片和页碎片锁锁的仪器所取代:

      • wait/synch/sxlock/innodb/lock_sys_global_rw_lock

      • wait/synch/mutex/innodb/lock_sys_table_mutex

      • wait/synch/mutex/innodb/lock_sys_page_mutex

    • 截至mysql8.0.21,使用 DATA DIRECTORY 条款只限于已知的目录InnoDB .此更改允许数据库管理员控制表空间数据文件的创建位置,并确保在恢复过程中可以找到数据文件。

      一般及每个表空间的资料档案(.ibd 无法在撤销表空间目录(innodb_undo_directory )除非你直接知道 InnoDB .

      已知的目录是由 datadir , innodb_data_home_dir ,以及innodb_directories 变量。

      把一个InnoDB 位于每个表表空间中的表降低了现有表空间,并创建了一个新的表空间。截至我的数据8.0.21,InnoDB 在默认位置创建新的表空间,如果当前表空间目录未知,则向错误日志写入警告。拥有TRUNCATE TABLE 在当前位置创建表空间,将目录添加到 innodb_directories 运行前设置TRUNCATE TABLE .

    • 对于mysql8.0.21,可以启用重做日志记录并使用 ALTER INSTANCE {ENABLE|DISABLE} INNODB REDO_LOG 语法。此功能用于将数据加载到新的mysql实例中。禁用重做日志记录有助于通过避免重做日志写入来加速数据加载。

      新的 INNODB_REDO_LOG_ENABLE 特权许可允许启用和禁用重做日志记录。

      新的 Innodb_redo_log_enabled 状态变量允许监视重做日志状态。

      看 禁用重做日志记录 .

    • 在启动时,InnoDB 用数据字典中存储的表空间文件路径验证已知表空间文件的路径,以防表空间文件移到不同的位置。新的 innodb_validate_tablespace_paths 在mysql8.0.21中引入了变量,允许禁用表空间路径验证。此功能用于不移动表空间文件的环境。禁用表空间路径验证提高了大量表空间文件系统上的启动时间。

      详情请参阅 15.6.3.7节,"禁用表空间路径验证" .

    • 在支持原子DDL的存储引擎上, CREATE TABLE ... SELECT 语句在使用基于行的复制时作为一个事务记录在二进制日志中。以前,它记录为两个事务,一个用于创建表,另一个用于插入数据。有了这个改变, CREATE TABLE ... SELECT 语句现在对于基于行的复制是安全的,并允许使用基于GTE的复制。详情请参阅 第13.1.1节,"原子数据定义说明支持" .

    • 在繁忙系统上缩短撤销表空间可能会影响性能,因为相关的冲洗操作将旧的撤销表空间页从缓冲池中移除,并将新的撤销表空间的初始页冲到磁盘上。为了解决这个问题,在mysq8.0.21中删除了冲洗操作。

      旧的撤销表空间页是被动地释放,因为它们成为最近使用最少的,或删除在下一个全面检查点。在截断操作期间,新的撤销表空间的初始页面现在被重新记录,而不是冲到磁盘,这也提高了撤销表空间截断操作的耐久性。

      为了防止过多的撤销表空间截断操作造成的潜在问题,在检查站之间的同一撤销表空间上的截断操作现在仅限于64个。如果超过了限制,仍然可以使撤销表空间处于不活动状态,但在下一个检查点之后才会被截断。

      INNODB_METRICS 与已失效的撤销截断冲洗操作相关的计数器被移除。移除的柜台包括: undo_truncate_sweep_count , undo_truncate_sweep_usec , undo_truncate_flush_count ,以及 undo_truncate_flush_usec .

      看 第15.6.3.4节,"撤销表空间" .

    • 我的数据是8.0.22 innodb_extend_and_initialize 变量允许配置如何 InnoDB 将空间分配给Linux上的每个表和一般表空间。默认情况下,当操作需要在表空间中增加空间时,InnoDB 将页面分配到表空间,并将空写写入这些页面。如果经常分配新页面,这种行为会影响性能。你就可以 innodb_extend_and_initialize 在Linux系统上,以避免将空格写入新分配的表空间页面。何时 innodb_extend_and_initialize 禁用,空间分配使用 posix_fallocate()电话,保留空间而不写空文。

      Aposix_fallocate() 操作是非原子的,这使得在分配到表空间文件的空间和更新文件元数据之间发生失败成为可能。这样的失败会使新分配的页面处于未初始化的状态,导致失败InnoDB 尝试访问这些页面。为了防止这种情况,InnoDB 在分配新的表空间页之前,先写入重做日志记录。如果页面分配操作中断,则在恢复过程中从重做日志记录中重放操作。

    • 从我的8.0.23开始,InnoDB 支持加密表空间的双写入文件页的加密。这些页面使用相关表空间的加密密钥进行加密。详情请参阅 第15.13节,"因诺布数据休息加密" .

    • …temptable_max_mmap 在mysql8.0.23中引入了变量,定义了在开始在磁盘上存储内部临时表数据之前,允许调用存储引擎从内存映射(MMAP)文件中分配的最大内存量。从MMMAP文件中设置0禁用分配。详情请参阅 第8.4.4节,"mysql中的内部临时表使用" .

    • AUTOEXTEND_SIZE 方法,在mysql8.0.23中引入,定义了数量 InnoDB 当表空间满时,扩展表空间的大小,这样就有可能大幅度地扩展表空间的大小。… AUTOEXTEND_SIZE 备选办法得到了CREATE TABLE , ALTER TABLE , CREATE TABLESPACE ,以及 ALTER TABLESPACE 声明。详情请参阅 15.6.3.9节,"表空间自动扩展_尺寸配置" .

      一种AUTOEXTEND_SIZE 尺寸列被添加到信息架构中 INNODB_TABLESPACES 表

    • … innodb_segment_reserve_factor 系统变量,在mysql8.0.26中引入,允许配置保留为空页面的表空间文件段页面的百分比。详情请参阅 配置保留文件段页面的百分比 .

    • 在支持的平台上fdatasync() 系统呼叫, innodb_use_fdatasync 变量,在mysql8.0.26中引入,使用许可证 fdatasync() 代替 fsync() 为操作系统冲水。安fdatasync() 系统调用不会清除对文件元数据的更改,除非需要随后的数据检索,提供潜在的性能效益。

    • 我的数据是8.0.28 tmp_table_size 变量定义由可调用存储引擎创建的任何单独内存内临时表的最大大小。适当的大小限制可以防止单个查询消耗过多的全局可诱惑资源。看 内部临时表存储引擎 .

    • 从我的8.0.28, innodb_open_files 变量,它定义了文件的数量 InnoDB 可以一次打开,可以在运行时使用 声明。语句执行设置新限制的存储过程。 SELECT innodb_set_open_files_limit(N)

      防止非LRU管理的文件消耗整个文件 innodb_open_files 限制,非LRU管理的文件限于90%的 innodb_open_files 限额,保留10%的 innodb_open_files 限制LRU管理文件。

      …innodb_open_files 限制包括临时表空间文件,这些文件以前没有计入限制。

    • From MySQL 8.0.28,InnoDB 支持 ALTER TABLE ... RENAME COLUMN 使用的操作 ALGORITHM=INSTANT .

      有关此操作和支持此操作的其他DDL操作的更多信息ALGORITHM=INSTANT ,看 Section 15.12.1, “Online DDL Operations” .

    • From MySQL 8.0.29,InnoDB 支持 ALTER TABLE ... DROP COLUMN 使用的操作 ALGORITHM=INSTANT .

      在mysql8.0.29之前,立即添加的列只能作为表的最后一列添加。从mysql8.0.29,可以立即添加列到表中的任何位置。

      立即添加或删除列创建了受影响行的新版本。允许最多64行版本。全新的TOTAL_ROW_VERSIONS 信息模式中增加了一栏 INNODB_TABLES 跟踪行版本数量的表.

      查询更多有关支持DDL操作的信息 ALGORITHM=INSTANT ,看 Section 15.12.1, “Online DDL Operations” .

    • 从我的8.0.30, innodb_doublewrite 系统变量支持DETECT_ONLY 和DETECT_AND_RECOVER 布景。与…DETECT_ONLY 设置时,数据库页面内容不会写入双写缓冲区,恢复时不会使用双写缓冲区来修复不完整的页面写入。这个轻量级设置只用于检测不完整页面写入。… DETECT_AND_RECOVER 单位相当于现有的ON 布景。详情请参阅 15.6.4节,"双写缓冲区" .

    • From MySQL 8.0.30,InnoDB 支持重做日志容量的动态配置.… innodb_redo_log_capacity 系统变量可以在运行时设置,以增加或减少重做日志文件占用的磁盘空间总量。

      通过此更改,重做日志文件的数量及其默认位置也发生了变化。从我的8.0.30, InnoDB 维护32个重做日志文件#innodb_redo 数据目录中的目录。以前,InnoDB 默认情况下在数据目录中创建两个重做日志文件,重做日志文件的数量和大小由 innodb_log_files_in_group 和 innodb_log_file_size 变量。这两个变量现在被弃用了。

      innodb_redo_log_capacity 定义了设置, innodb_log_files_in_group 和 innodb_log_file_size 设置被忽略;否则,这些设置被用来计算 innodb_redo_log_capacity 单位(innodb_log_files_in_group *innodb_log_file_size =innodb_redo_log_capacity )。如果没有设置这些变量,则将重做日志容量设置为innodb_redo_log_capacity 默认值,为104857600字节(100MB)。

      为监视重做日志和重做日志调整操作提供了几个状态变量。

      详情请参阅 第15.6.5节,"重做日志" .

    • 使用mysql8.0.31,有两个新的状态变量用于监视在线缓冲池调整大小的操作。… Innodb_buffer_pool_resize_status_code 状态变量报告一个状态代码,显示在线缓冲池调整操作的阶段。… Innodb_buffer_pool_resize_status_progress 状态变量报告一个表示每个阶段进展的百分比值.

      详情请参阅 15.8.3.1节,"配置英诺布缓冲池大小" .

  • 字符集支持。  默认字符集从 latin1 到utf8mb4 .…utf8mb4 字符集有几个新的拼版,包括 utf8mb4_ja_0900_as_cs ,在mysql中第一个用于统一码的日语特定语言排序。详情请参阅 第10.10.1节,"统一码字符集" .

  • JSON增强功能。  以下是对mysqlJSON功能的增强或增补:

    • 增加 ->> (内联路径)操作符,相当于调用 JSON_UNQUOTE() 关于…的结果JSON_EXTRACT() .

      这是对列路径操作符的改进 -> 在mysql5.7中引入; col->>"$.path" 相当于 JSON_UNQUOTE(col->"$.path") .嵌入路径操作符可以在任何地方使用 JSON_UNQUOTE(JSON_EXTRACT()) ,如此 SELECT 列列表, WHERE 和HAVING 条款,以及ORDER BY 和 GROUP BY 条款。有关更多信息,请参阅操作员的描述以及 JSON路径语法 .

    • 增加两个JSON聚合函数 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() . JSON_ARRAYAGG() 以列或表达式作为参数,并将结果聚合为单个JSON 安排。表达式可以对任何mysql数据类型进行评价;这不一定是JSON 价值。 JSON_OBJECTAGG() 取两个列或表达式,它将其解释为一个键和一个值;它将结果作为单个返回JSON 反对。有关详情及例子,请参阅 第12.19节,"综合职能" .

    • 增加了JSON效用函数 JSON_PRETTY() ,其产出是JSON 以易读格式表示的值;每个JSON对象成员或数组值都在单独的一行上打印,而一个子对象或数组是针对其父对象的两个空格。

      此函数还使用可以作为JSON值解析的字符串。

      有关详情及例子,请参阅 Section 12.17.8, “JSON Utility Functions” .

    • 分类时JSON 查询中使用的值ORDER BY 现在,每个值都由排序键的可变长度部分表示,而不是固定的1K的一部分。在许多情况下,这可以减少过度使用。例如,一个标量INT 甚至 BIGINT 值实际上只需要很少的字节,所以这个空间的剩余部分(高达90%或更多)被填充物占用。这一变化对业绩有以下好处:

      • 排序缓冲空间现在被更有效地使用,所以文件不需要像使用固定长度的排序键那样提前或经常被冲到磁盘上。这意味着更多的数据可以在内存中排序,避免不必要的磁盘访问。

      • 与较长键相比,较短键可以更快地进行比较,从而显著提高了性能。对于完全在内存中执行的排序,以及需要从磁盘写入和读取的排序,都是如此。

    • 在mysql8.0.2中增加了对部分、局部更新的支持。JSON 列值,它比完全删除现有的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() 回报为零。如果不能将其参数作为有效的JSON文档解析,则任何一个函数都会产生错误, NULL 如果论点是 NULL .

      有关详情及例子,请参阅 Section 12.17.8, “JSON Utility Functions” .

      JSON_STORAGE_SIZE() 和 JSON_STORAGE_FREE() 是在mysq8.0.2中实现的。

    • 在mysql8.0.2中增加了对以下范围的支持: $[1 to 5] 在XPth表达式中。在这个版本中也增加了对 last 关键词和相对地址,例如$[last] 总是选择数组中的最后一个(数字最高的)元素, $[last-1] 最后一个元素。 last 使用它的表达式也可以包括在范围定义中。例如, $[last-2 to last-1] 从数组返回最后两个元素,只有一个。看 搜索和修改JSON值 ,供查阅其他资料和例子。

    • 增加一个JSON合并函数,目的是符合 7396RFC . JSON_MERGE_PATCH() 当用于2个JSON对象时,将它们合并为一个JSON对象,该对象具有以下集合的一个成员联盟:

      • 第一个对象的每个成员,其在第二个对象中没有具有相同键的成员。

      • 第二个对象的每个成员,其在第一个对象中没有具有相同密钥的成员,且其值不是JSON null 很真实。

      • 每个成员拥有两个对象中存在的键,其在第二个对象中的值不是JSONnull 很真实。

      作为这项工作的一部分, JSON_MERGE() 职能已改名 JSON_MERGE_PRESERVE() . JSON_MERGE() 继续被确认为 JSON_MERGE_PRESERVE() 在mysql8.0中,但是现在被弃用,并在未来的mysql版本中被删除。

      有关详情及例子,请参阅 第12.17.4节,"修改JSON值的功能" .

    • 已执行的 “ 最后一键赢 ” 重复键的规范化,符合 RFC7159 以及大多数的java签名解析者。这个行为的一个例子显示在这里,只有最右边的成员拥有键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() 功能为mysql8.4.4。此函数接受JSON数据,并将其作为具有指定列的关系表返回。

      这个函数有语法 ,在哪里 是一个返回JSON数据的表达式, 是一个应用于源代码的JSON路径,并且 是列定义的列表。这里举了一个例子: JSON_TABLE(exprpath 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') .详情请参阅 Section 12.17.6, “JSON Table Functions” .

  • 数据类型支持。  Mysql现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为 BLOB , TEXT , GEOMETRY ,以及 JSON 以前根本不能指定默认值的数据类型。详情请参阅 第11.6节,"数据类型默认值" .

  • 优化器。  增加了这些优化器改进:

    • Mysql现在支持隐形索引。优化器根本不使用隐形索引,但在其他方面保持正常。默认情况下,索引是可见的。看不见的索引使测试删除索引对查询性能的影响成为可能,而不需要进行破坏性的更改,如果需要删除索引,则必须取消这种更改。看 第8.3.12节,"无形索引" .

    • Mysql现在支持下降索引: DESC 索引定义不再被忽略,而是导致键值的存储按降序进行。以前,索引可以按相反的顺序扫描,但会受到性能惩罚。一个下降的索引可以按前进顺序扫描,这是更有效的。当最有效的扫描顺序将某些列的升序和其他列的降序相混合时,降序也使优化器使用多列索引成为可能。看 第8.3.13节,"下降指数" .

    • Mysql现在支持创建功能性的索引键,这些索引键的索引表达式值而不是列值。功能性关键部分能够对无法以其他方式进行索引的值进行索引,例如: JSON 价值观。详情请参阅 13.1.15节,"创建索引语句" .

    • 在mysql8.0.14及以后,微不足道 WHERE 常量文字表达式产生的条件在准备过程中删除,而不是在优化过程中删除。在过程的早期删除条件使得简化外部连接查询的连接成为可能,例如这个条件:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1

      优化器现在看到在准备过程中0=1总是错误的,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节,"外部连接优化" .

    • 在mysql8.0.16及以后,mysql可以在优化时间使用常量折叠处理列和常量值之间的比较,因为常量超出范围或在列类型的范围边界上,而不是在执行时对每一行这样做。例如,给一张桌子 t 以TINYINT UNSIGNED 柱c ,优化器可以改写诸如WHERE c < 256 到WHERE 1 (并将条件完全优化),或 WHERE c >= 255 到WHERE c = 255 .

      看 8.2.1.14节,"固定折叠优化" ,详情请参阅。

    • 从mysq8.0.16开始,使用IN 子查询现在可以应用到EXISTS 子查询也是。此外,优化器现在在 WHERE 附加在子查询上的条件,这样它们就可以被类似于IN 子查询;这适用于两个EXISTS 和 IN 子查询。

      详情请参阅 第8.2.2.1节,"用半连接变换优化子查询谓词并使其存在" .

    • 到mysql8.0.17时,服务器重写任何不完整的SQL谓词(即,拥有表单的谓词) ,其中 是列名或常量表达式,内部不使用比较运算符。 在上下文化阶段,所以查询解析器、查询优化器和查询执行器只需要使用完整的谓词。 WHERE valuevalueWHERE value <> 0

      这个变化的一个可见的效果是,对于布尔值,EXPLAIN 产出现在显示true 和 false ,而不是 1 和0 .

      此更改的另一个效果是,在SQL布尔上下文中对JSON值进行隐式比较,而不是JSON整数0。考虑一下这里所示的创建和填充表:

      mysql> CREATE TABLE test (id INT, col JSON);
      
      mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');

      在此之前,服务器尝试转换 true 或false 当在SQL布尔上下文中比较一个SQL布尔值时,如下面使用的查询所示 IS TRUE :

      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+

      在mysql8.0.17及以后,提取的值与JSON整数0的隐式比较导致了不同的结果:

      mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
      +------+----------------+--------------+
      | id   | col            | col->"$.val" |
      +------+----------------+--------------+
      |    1 | {"val": true}  | true         |
      |    2 | {"val": false} | false        |
      +------+----------------+--------------+

      从mysql8.0.21开始,你可以使用 JSON_VALUE() 在执行测试之前执行类型转换的提取值,如图所示:

      mysql> SELECT id, col, col->"$.val" FROM test
          ->     WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
      +------+---------------+--------------+
      | id   | col           | col->"$.val" |
      +------+---------------+--------------+
      |    1 | {"val": true} | true         |
      +------+---------------+--------------+

      也从mysql8.0.21开始,服务器提供警告 在SQL布尔上下文中评估一个JSON值可以与JSON整数0进行隐式比较;如果不是您想要的,考虑将JSON转换为具有JSON值返回的SQL数字类型 以这种方式比较SQL布尔上下文中提取的值时。

    • 在mysql8.0.17和以后的WHERE 有条件的 或 变成反连接。(反连接返回表中与连接条件匹配的表中没有行的所有行。由于子查询的表现在在最高级别上进行处理,因此删除可以导致更快的查询执行的子查询。 NOT IN (subquery)NOT EXISTS (subquery)

      它类似于现有的IS NULL (Not exists )外连接的优化;请参阅 解释额外信息 .

    • 从mysql8.0.21开始,一个单表 UPDATE 或 DELETE 语句现在可以在许多情况下使用半连接变换或子查询物化。这适用于以下表格的说明:

      • UPDATE t1 SET t1.a=value WHERE t1.a IN (SELECT t2.a FROM t2)

      • DELETE FROM t1 WHERE t1.a IN (SELECT t2.a FROM t2)

      对于一个单表的人来说 UPDATE 或DELETE 符合下列条件:

      • UPDATE 或 DELETE 语句使用一个子查询[NOT] IN 或 [NOT] EXISTS 先说。

      • 声明没有ORDER BY 有,没有LIMIT 条款。

        (多台版本 UPDATE 和 DELETE 不支持 ORDER BY 或 LIMIT .)

      • 目标表不支持即时删除(只适用于: NDB tables).

      • 基于子查询中包含的任何提示和 optimizer_switch .

      当半连接优化用于一个合格的单表时DELETE 或 UPDATE ,这在优化器跟踪中是可见的:对于多表语句,有一个 join_optimization 跟踪中的对象,而单表语句则没有。转换也可见于 EXPLAIN FORMAT=TREE 或 EXPLAIN ANALYZE ;单表报表显示 ,而一个多表格的陈述报告了一个完整的计划。

      也从mysql8.0.21开始,多台支持半一致性读取UPDATE 使用语句InnoDB 对于事务隔离级别小于 REPEATABLE READ .

    • 改进散列连接性能。  Mysql8.0.23重新实现用于散列连接的散列表,从而对散列连接性能进行了若干改进。这项工作包括对一个问题的修复(BU#31516149,BOM#99933),其中只分配给连接缓冲区的大约2/3的内存(join_buffer_size )实际上可以由散列连接使用。

      新散列表通常比旧散列表快,用于对齐、键/值和有许多相等键的情况下的内存较少。此外,当哈希表的大小增加时,服务器现在可以释放旧内存。

  • 常见表表达式。  Mysql现在支持普通表表达式,包括非递归和递归。通用表表达式允许使用指定的临时结果集,通过允许使用WITH 前条SELECT 发言和某些其他发言。详情请参阅 第13.2.20节,"加上(通用表格)" .

    截至mysq8.0.19,递归 SELECT 递归公共表表达式(CTE)的一部分支持 LIMIT 条款。LIMIT 与…有关OFFSET 也得到支持。看 递归通用表表达式 ,详情请参阅。

  • 窗口功能。  Mysql现在支持窗口函数,对于来自查询的每一行,使用与该行相关的行执行计算。这些职能包括: RANK() , LAG() ,以及 NTILE() .此外,一些现有的聚合函数现在可以用作窗口函数(例如, SUM() 和 AVG() )。详情请参阅 第12.20节,"窗口功能" .

  • 横向派生表。  现在的派生表可以用 LATERAL 指定允许在同一表中提及(依)前列的关键词FROM 条款。横向派生表使某些SQL操作成为可能,这些操作无法使用非横向派生表或需要较低效率的变通办法。看 第13.2.15.9节,"横向派生表" .

  • 单表删除语句中的别名。  在mysql8.0.16及以后,单表 DELETE 语句支持使用表别名。

  • 常规表达式支持。  以前,mysql使用亨利斯宾塞正则表达式库来支持正则表达式操作符(REGEXP , RLIKE )。正则表达式支持已经重新实现,使用国际组件为统一码提供完全的统一码支持,是多字节安全的。… REGEXP_LIKE() 函数执行正则表达式匹配的方式 REGEXP 和 RLIKE 操作器,现在是该功能的同义词。此外, REGEXP_INSTR() , REGEXP_REPLACE() ,以及 REGEXP_SUBSTR() 函数可以分别找到匹配位置和执行子字符串替换和提取。… regexp_stack_limit 和 regexp_time_limit 系统变量通过匹配引擎控制资源消耗.详情请参阅 第12.8.2节,"正则表达式" .有关使用正则表达式的应用程序可能受实现更改影响的方式的信息,请参阅 正则表达式兼容性考虑 .

  • 内部临时表格。  …TempTable 储存引擎替换MEMORY 存储引擎作为内存内部临时表的默认引擎。…TempTable 储存引擎可有效储存 VARCHAR 和 VARBINARY 列柱。… internal_tmp_mem_storage_engine 会话变量为内存内部临时表定义存储引擎。允许值 TempTable (默认)和 MEMORY .… temptable_max_ram 变量定义最大内存量 TempTable 存储引擎可以在数据存储到磁盘之前使用.

  • 伐木。  这些改进是为了改进伐木工作:

    • 为了使用mysql组件体系结构,重新编写了错误日志记录。传统的错误日志记录是使用内置组件实现的,而使用系统日志的日志记录是作为可加载组件实现的。此外,还提供可加载的JSON日志编写器。详情请参阅 第5.4.2节,"错误日志" .

    • 从mysql8.0.30,错误日志组件可以在启动前隐式加载。 InnoDB 提供存储引擎。这种新的加载错误日志组件加载方法,并启用了由 log_error_services 变量。

      以前,必须首先使用错误日志组件INSTALL COMPONENT 只会在 InnoDB 完全可用,因为要装载的组件列表是从 mysql.components 表格,这是 InnoDB 表

      隐式加载错误日志组件有以下优点:

      • 日志组件在启动序列中加载得更早,使日志信息更早可用。

      • 它有助于避免在启动过程中发生故障时丢失缓冲日志信息。

      • 使用的装载日志组件 INSTALL COMPONENT 不需要,简化错误日志配置。

      加载日志组件的明确方法 INSTALL COMPONENT 仍支持后向兼容性。

      详情请参阅 第5.4.2.1节,"错误日志配置" .

  • 后备锁。  一种新型备份锁允许在在线备份期间使用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服务器现在允许专门为行政连接配置一个tml/IP端口。这提供了一个替代单一管理连接的选择,即使普通连接所使用的网络接口上允许使用该管理连接 max_connections 连接已经建立。看 5.1.12.1节,"连接接口" .

    Mysql现在提供了对压缩使用的更多控制,以最大限度地减少通过连接发送到服务器的字节数。以前,给定的连接要么未压缩,要么使用了zlib 压缩算法。现在,也有可能使用 zstd 算法,并选择一个压缩级zstd 关系。允许的压缩算法可以在服务器端配置,也可以在连接起源端配置,以便由客户机程序和参与源/复制复制或组复制的服务器连接。详情请参阅 第4.2.8节,"连接压缩控制".

  • 配置。  整个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 系统变量和相应的选项。如果基于主机名称的值对操作系统来说太长,则必须提供显式较短的值。

    • 虽然服务器现在支持255个字符的主机名,但与服务器的连接使用的是 --ssl-mode=VERIFY_IDENTITY 选项受最大主机名长度的限制,支持开放。主机名称匹配涉及SSL证书的两个字段,其最大长度如下:公共名称:最大长度64;主题替代名称:最大长度根据RFC#1034。

  • 普洛金斯。  以前,mysql插件可以用C或C++编写。插件使用的mysql头文件现在包含C++代码,这意味着插件必须用C++而不是C编写。

  • cAPI。  mysqcAPI现在支持与mysql服务器进行非阻塞通信的异步功能。每个函数都是现有同步函数的异步对应物。如果从服务器连接读取或写入到服务器连接,则必须等待同步函数块.异步函数使应用程序能够检查服务器连接上的工作是否准备好进行。如果没有,应用程序可以在以后再次检查之前执行其他工作。看 CAPI异步接口 .

  • 其他铸造目标类型。  职能CAST() 和 CONVERT() 现在支持转换为类型 DOUBLE , FLOAT ,以及 REAL .我加了8.0.17。看 第12.10节,"铸造职能和操作者" .

  • JSON架构验证。  Mysql8.0.17增加两个功能 JSON_SCHEMA_VALID() 和 JSON_SCHEMA_VALIDATION_REPORT() 用于再次验证JSON文档。 JSON_SCHEMA_VALID() 如果文档对架构进行验证,则返回真实(1);如果没有,则返回错误(0)。 JSON_SCHEMA_VALIDATION_REPORT() 返回包含验证结果详细信息的JSON文档。以下声明适用于这两项职能:

    • 该架构必须符合JSON架构规范的草案4。

    • required支持属性。

    • 外部资源和$ref 关键词不支持。

    • 正则表达式模式得到支持;无效的模式被默默地忽略。

    看 第12.17.7节,"JSON架构验证功能" ,以了解更多资料和例子。

  • 多价值指数。  从我的8.0.17开始, InnoDB 支持建立一个多值指数,它是在JSON 列,它存储一个值数组,并且可以为单个数据记录提供多个索引记录。这样的索引使用一个关键部分定义,例如: CAST(data->'$.zipcode' AS UNSIGNED ARRAY) .mysql优化器自动使用多值索引来进行适当的查询,这一点可以在 EXPLAIN .

    作为这项工作的一部分,mysql增加了一个新的函数 JSON_OVERLAPS() 新的 MEMBER OF() 与…合作的操作员JSON 文件,以及 CAST() 具有新功能 ARRAY 关键词,如下列清单所述:

    • JSON_OVERLAPS() 比较二 JSON 文件。如果它们共同包含任何键值对或数组元素,则函数返回正确(1);否则,它返回错误(0)。如果两个值都是标量,则函数执行一个简单的相等性测试。如果一个参数是一个JSON数组,而另一个参数是一个标量,那么标量将被视为一个数组元素。因此, JSON_OVERLAPS() 作为对…的补充JSON_CONTAINS() .

    • MEMBER OF()测试第一个操作数(标量或JSON文档)是否是作为第二个操作数传递的JSON数组的成员,如果是,则返回正确的(1),如果不是错误的(0)。没有执行操作数的类型转换。

    • CAST(expression AS type ARRAY) 允许通过铸造在JSON文档中的JSON数组创建函数索引。 json_path 到一个SQL数组。类型说明器只限于那些已经支持CAST() ,除了 BINARY (未得到支持)。使用 CAST() (以及 ARRAY 关键词)仅由 InnoDB ,而且只用于创建一个多值索引。

    有关多值索引的详细信息,包括示例,请参阅 多值指数 . 第12.17.3节,"搜索JSON值的功能" ,提供有关JSON_OVERLAPS() 和 MEMBER OF() 以及使用实例。

  • 不稳定时间区。  我的数据是8.0.17 time_zone 会话变量可以使用 SET_VAR .

  • 重做日志归档。  截至我的数据8.0.17,InnoDB 支持重做日志归档。复制重做日志记录的备份实用程序在备份操作正在进行时,有时可能无法跟上重做日志生成的步伐,导致重做日志记录丢失,因为这些记录被覆盖。重做日志归档功能通过将重做日志记录顺序写入存档文件来解决这个问题。备份实用程序可以根据需要从存档文件中复制重做日志记录,从而避免潜在的数据丢失。详情请参阅 重做日志归档 .

  • 克隆人插件。  截至mysql8.0.17,mysql提供了一个允许克隆的克隆插件InnoDB 本地数据或来自远程mysql服务器实例的数据。本地克隆操作将克隆数据存储在与mysql实例运行的同一服务器或节点上。远程克隆操作将克隆数据通过网络从捐赠者mysql服务器实例转移到启动克隆操作的接收者服务器或节点。

    克隆插件支持复制。除了克隆数据外,克隆操作从提供者那里提取和传输复制,并将它们应用到接收者身上,这使得使用克隆插件来提供组复制成员和副本成为可能。使用克隆插件来提供比复制大量事务要快得多,效率更高。也可以将组复制成员配置为使用克隆插件作为替代的恢复方法,从而使成员自动选择从种子成员检索组数据的最有效方式。

    详情请参阅 5.6.7节,"克隆人插件" ,以及 第18.5.4.2节,"克隆促进分布式恢复" .

    对于mysq8.0.27,在克隆操作进行中,允许在捐助者mysql服务器实例上并发DDL操作。以前,在克隆操作期间会有一个备份锁,防止在捐赠者身上出现并发的DDL。在克隆操作期间,若要恢复先前在捐赠者身上阻塞并发DDL的行为,请启用clone_block_ddl 变量。看 第5.6.7.4节,"克隆和同时使用DDL" .

    我的数据是8.0.29 clone_delay_after_data_drop 变量允许在远程克隆操作开始时删除接收者mysql服务器实例上的现有数据后立即指定延迟期。延迟的目的是为接收主机上的文件系统提供足够的时间,以便在从提供者mysql服务器实例克隆数据之前腾出空间。某些文件系统在后台过程中异步释放空间。在这些文件系统上,在删除现有数据后过早克隆数据可能会由于空间不足而导致克隆操作失败。最大延迟时间为3600秒(1小时).默认设置为0(无延迟)。

  • 哈希连接优化。  从mysq8.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)

    Hash连接也可以用于笛卡尔产品,也就是说,当没有指定连接条件时。

    您可以看到当使用哈希连接优化对特定查询使用时 EXPLAIN FORMAT=TREE 或EXPLAIN ANALYZE .(在mysq8.20.20及以后,你也可以使用EXPLAIN ,省略 FORMAT=TREE .)

    散列连接可用内存的数量受 join_buffer_size .在磁盘上执行需要更多内存的散列连接;磁盘散列连接可使用的磁盘文件的数量受到以下限制: open_files_limit .

    我的数据是8.0.19 hash_join 在mysql8.0.18中引入的优化开关不再受支持(Hash_加入=上仍然是优化开关值的一部分,但设置它不再有任何效果)。…HASH_JOIN 和 NO_HASH_JOIN 优化提示也不再支持。这个开关和提示现在都被弃用了;希望在未来的mysql版本中删除它们。在mysql8.0.18中,散列连接可以使用NO_BNL 优化开关。

    在mysq8.20.20及以后,在mysql服务器中不再使用块嵌套循环,即使查询不包含等连接条件,任何时候都会使用块嵌套循环。这适用于内部非等连接、半连接、反连接、左外部连接和右外部连接。… block_nested_loop 中国国旗optimizer_switch 系统变量以及 BNL 和 NO_BNL仍然支持优化提示,但从今以后只控制散列连接的使用。此外,内部连接和外部连接(包括半连接和反连接)现在都可以使用批键访问(Baka),这种访问可以逐步分配连接缓冲内存,这样单个查询就不需要占用大量实际上不需要解决的资源。仅支持内部连接的Baka从mysq8.0.18开始。

    Mysql8.20.20还可以用迭代器执行器取代以前的mysql版本中使用的执行器。这项工作包括替换管理表单查询的旧索引子查询引擎 对于那些 没有被优化为半连接的查询,以及相同形式的查询,这以前依赖于旧的执行者。 WHERE value IN (SELECT column FROM table WHERE ...)IN

    有关详情及例子,请参阅 8.2.1.4节,"散列连接优化" .另见 批键存取连接 .

  • 解释分析声明。  一种新形式的EXPLAIN 声明,EXPLAIN ANALYZE ,在mysq8.0.18中实现,提供关于执行 SELECT 声明 TREE 格式用于处理查询时使用的每个迭代器,并有可能将估计成本与查询的实际成本进行比较。此信息包括启动成本、总成本、此迭代器返回的行数以及执行的循环数。

    在mysql8.0.21及以后,这个语句也支持 FORMAT=TREE 指定人。 TREE 是唯一支持的格式。

    看 通过解释分析获得信息 ,详情请参阅。

  • 询问铸造注射。  在8.0.18版本和以后版本中,mysql在参数的数据类型与预期数据类型不匹配的表达式和条件中向查询项树注入了操作。这对查询结果或执行速度没有影响,但使执行的查询等同于符合SQL标准的查询,同时保持了与以前的mysql版本的反向兼容性。

    这种隐式转换现在在时间类型之间进行(DATE , DATETIME , TIMESTAMP , TIME )及数字类型(SMALLINT , TINYINT , MEDIUMINT , INT /INTEGER , BIGINT ; DECIMAL /NUMERIC ; FLOAT , DOUBLE , REAL ; BIT )在使用任何标准数字比较操作符进行比较时(= , >= , > , < , <= , <> /!= ,或 <=> )。在这种情况下,任何价值 DOUBLE 是一个整体。现在还进行铸造注射,以比较 DATE 或 TIME 价值观和 DATETIME 价值观,在必要时提出论据 DATETIME .

    从mysql8.0.21开始,在比较字符串类型和其他类型时,也会执行这样的转换。铸造的字符串类型包括CHAR , VARCHAR , BINARY , VARBINARY , BLOB , TEXT , ENUM ,以及 SET .将字符串类型的值与数字类型或 YEAR ,这串线是为了 DOUBLE ;如果其他论点的类型不是FLOAT ,DOUBLE ,或REAL ,这也是为了 DOUBLE .当将字符串类型与 DATETIME 或TIMESTAMP 值,这串线是为了DATETIME ;在比较字符串类型时DATE ,这串绳子是为了DATE .

    通过查看输入到给定的查询中的输出,可以看到如何将转换注入到给定的查询中。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> CREATE TABLE s (c CHAR(25), vc VARCHAR(25),
        ->     bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT,
        ->     e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));
    Query OK, 0 rows affected (0.50 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double))
    (cost=0.70 rows=1)
        -> Table scan on n  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on d  (cost=0.35 rows=1)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6)))  (cost=0.72 rows=1)
        -> Table scan on d  (cost=0.37 rows=1)
        -> Hash
            -> Table scan on s  (cost=0.35 rows=1)
    
    1 row in set (0.01 sec)
    
    mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
        -> Table scan on s  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on n  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)

    也可以通过执行EXPLAIN [FORMAT=TRADITIONAL] ,在这种情况下,也有必要发出SHOW WARNINGS 执行死刑后 EXPLAIN 声明。

  • 对时间戳和数据时间的时差支持。  截至mysq8.0.19时,服务器接受一个插入数据时间(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' .

    在选择数据时间值时,不会显示时差抵消。

    时间文字包含了时差抵消可以作为准备的语句参数值。

    作为这项工作的一部分,用来设置 time_zone 系统变量现在也只限于范围 -13:59 到+14:00 ,包括在内。(将名称值分配给 time_zone 例如 'EST' , 'Posix/Australia/Brisbane' ,以及 'Europe/Stockholm' 此变量,但条件是必须加载mysql时差表;请参阅 使用时差表 ).

    有关详情及例子,请参阅 第5.1.15节,"mysql服务器战区支持" ,以及 第11.2.2节,"日期、日期和时间戳类型" .

  • JSON架构检查约束失败的精确信息。  使用时 JSON_SCHEMA_VALID() 指定一个CHECK 限制,mysq8.0.19和以后提供了关于这些约束失败原因的精确信息。

    有关例子及更多资料,请参阅 和检查约束 .另见 第13.1.20.6节,"检查限制" .

  • 行和列别名与重复键更新。  从mysq8.0.19开始,可以引用要插入的行,并可选择地引用其列,使用别名。考虑: INSERT 桌上的声明 t 有柱a 和b :

    INSERT 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.7.2节,"插入。..重复的关键更新声明" .

  • 标准明确表子句和表值构造函数.  根据SQL标准添加表值构造函数和显式表子句.它们分别在mysql8.0.19中实现,作为 TABLE 声明和声明 VALUES 声明。

    …TABLE 声明有格式 ,相当于 .它支持 和 条款(后者具有选择性) ),但不容许选择个别表格列。 你可以在任何地方使用 声明;包括联合,工会, , , 语句和子查询。例如: 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 可用来提供一个表值INSERT , REPLACE ,或 SELECT 声明,包括VALUES 后面是一系列行构造函数(ROW() )用逗号分隔。例如,声明 INSERT INTO t1 VALUES ROW(1,2,3), ROW(4,5,6), ROW(7,8,9) 提供相当于千年发展目标特定目标的遵守sql标准的INSERT INTO t1 VALUES (1,2,3), (4,5,6), (7,8,9) .你也可以选择 VALUES 表值构造函数就像您希望的表一样,记住在这样做时必须提供表别名,并使用此方法 SELECT 就像你会做的一样,这包括连接、联合和子查询。

    欲知更多有关TABLE 和 VALUES ,并请参阅本文件以下各节:

    • 第13.2.16节,"表格说明"

    • 第13.2.19节,"价值说明"

    • 13.1.20.4节,"创造表格。..选择语句"

    • Section 13.2.7.1, “INSERT ... SELECT Statement”

    • 第13.2.13.2节,"加入条款"

    • Section 13.2.15, “Subqueries”

    • 第13.2.18节,"工会条款"

  • 优化器提示力量指数,忽略指数.  Mysql8.0引入了指数级优化建议,这些建议类似于 第8.9.4节,"索引提示" .新的提示和他们的FORCE INDEX 或IGNORE INDEX 等价:

    • GROUP_INDEX:等于FORCE INDEX FOR GROUP BY

      NO_GROUP_INDEX:等于IGNORE INDEX FOR GROUP BY

    • JOIN_INDEX:等于FORCE INDEX FOR JOIN

      NO_JOIN_INDEX:等于IGNORE INDEX FOR JOIN

    • ORDER_INDEX:等于FORCE INDEX FOR ORDER BY

      NO_ORDER_INDEX:等于IGNORE INDEX FOR ORDER BY

    • 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 以达到同样的效果。

    有关详情和使用实例,请参阅 指数级优化器提示 .

  • 函数。  Mysql8.0.21实现新功能 JSON_VALUE() 旨在简化JSON 列柱。在其最基本的形式中,它将指向该文档中单个值的JSON文档和JSON路径作为参数,并(可选择地)允许您使用 RETURNING 关键词。 相当于: JSON_VALUE(json_docpath RETURNING type)

    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 j->"$.name" as name, j->"$.price" as price 
        FROM t1
        WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;

    在许多情况下,这比从JSON 然后在生成的列上创建一个索引。

    有关更多信息和示例,请参阅 JSON_VALUE() .

  • 用户注释和用户属性.  介绍在创建或更新用户帐户时设置用户评论和用户属性的能力。用户注释由作为参数传递到COMMENT 与CREATE USER 或 ALTER USER 声明。用户属性由以JSON对象的形式传递的数据组成,这些数据作为参数传递到 ATTRIBUTE 这两个语句中的任何一个使用的条款。属性可以在JSON对象符号中包含任何有效的键值对。只有一个 COMMENT 或ATTRIBUTE 可用于一个CREATE USER 或 ALTER USER声明。

    用户注释和用户属性作为JSON对象内部存储在一起,注释文本作为元素的值comment 作为它的钥匙。此资料可从 ATTRIBUTE 信息模式栏USER_ATTRIBUTES 由于它是JSON格式的,您可以使用mysql的JSON函数和操作符解析它的内容(参见 Section 12.17, “JSON Functions” )。用户属性的连续更改与当前值合并为使用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":"[email protected]"}';
    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: [email protected]
       Comment: This is Mary Smith's account
    1 row in set (0.00 sec)

    有关详情及例子,请参阅 第13.7.1.3节,"创建用户声明" , 第13.7.1.1节,"更改用户说明" ,以及 第26.3.46节,"信息_模式-用户属性表" .

  • 新的优化交换旗。  Mysql8.0.21为可持续发展委员会 optimizer_switch 系统变量,见以下清单:

    • prefer_ordering_index 旗

      在默认情况下,mysql尝试使用一个有序的索引ORDER BY 或GROUP BY 有问题的人LIMIT 当优化器确定这会导致更快的执行时。因为在某些情况下,为此类查询选择不同的优化实际上性能更好,现在可以通过设置 prefer_ordering_index 支持off .

      这个标志的默认值是 on .

    • subquery_to_derived 旗

      当这面旗被设置成on ,优化器将合格的标量子查询转换为派生表上的连接。例如,查询 SELECT * FROM t1 WHERE t1.a > (SELECT COUNT(a) FROM t2) 改写为 SELECT t1.a FROM t1 JOIN ( SELECT COUNT(t2.a) AS c FROM t2 ) AS d WHERE t1.a > d.c .

      这种优化可以应用到子查询中,子查询是SELECT , WHERE ,JOIN ,或 HAVING 包含一个或多个聚合函数,但没有GROUP BY 不相关;不使用任何非确定性函数。

      优化也可以应用到表子查询中,它是IN , NOT IN ,EXISTS ,或 NOT EXISTS ,其中不包括GROUP BY .例如,查询SELECT * FROM t1 WHERE t1.b < 0 OR t1.a IN (SELECT t2.a + 1 FROM t2) 改写为SELECT a, b FROM t1 LEFT JOIN (SELECT DISTINCT 1 AS e1, t2.a AS e2 FROM t2) d ON t1.a + 1 = d.e2 WHERE t1.b < 0 OR d.e1 IS NOT NULL .

      从mysql8.0.24开始,这个优化也可以通过对相关标量子查询应用一个额外的分组,然后在提升的谓词上使用外部连接。例如,诸如 SELECT * FROM t1 WHERE (SELECT a FROM t2 WHERE t2.a=t1.a) > 0 可改写为 SELECT t1.* FROM t1 LEFT OUTER JOIN (SELECT a, COUNT(*) AS ct FROM t2 GROUP BY a) AS derived ON t1.a = derived.a WHERE derived.a > 0 .mysql执行基数检查,以确保子查询不返回超过一行(ER_SUBQUERY_NO_1_ROW ). See 第13.2.15.7节,"相关子查询" ,详情请参阅。

      这种优化通常是无效的,因为它在大多数情况下不会产生明显的性能效益;off 默认的。

    详情请参阅 8.9.2节,"可切换优化" .另见 8.2.1.19节,"限制查询优化" , 第8.2.2.1节,"用半连接变换优化子查询谓词并使其存在" ,以及 8.2.2.4节,"合并或物化时优化派生表、视图引用和通用表表达式" .

  • XML增强功能。  我的数据是8.0.21LOAD XML 声明现在支持 CDATA 要导入的XML中的章节。

  • 对现在支持的年份类型的铸造。  从mysql8.0.22开始,服务器允许 YEAR .两者 CAST() 和 CONVERT() 功能支持个位数、两位数和四位数 YEAR 价值观。对于一位数和两位数的值,允许的范围是0-99。四位数的数值必须在1901-2155之间。 YEAR 也可用作JSON_VALUE() 功能;该功能仅支持四位数年。

    字符串、时间和日期以及浮点值都可以转换为YEAR .铸造 GEOMETRY 价值观 YEAR 是不支持的。

    有关更多信息,包括转换规则,请参阅CONVERT() 职能。

  • 检索UTC的时间戳值。  Mysql8.0.22及以后支持 TIMESTAMP 从系统时差到协调世界时的列值 DATETIME 关于检索,使用 ,其中一个是 或 .精确度 如果需要的话,可指定由铸造返回的值,最高可达小数点后6位。… 这个构造不支持关键词。 CAST(value AT TIME ZONE specifier AS DATETIME)[INTERVAL] '+00:00''UTC'DATETIMEARRAY

    TIMESTAMP 同时也支持使用位差插入到表中的值.使用 AT TIME ZONE 不支持 CONVERT() 或任何其他的mysql函数或构造。

    有关详情和例子,请参阅CAST() 职能。

  • 丢文件输出同步.  Mysql8.0.22及以后在编写 SELECT INTO DUMPFILE 和SELECT INTO OUTFILE 声明。这可以通过设置 select_into_disk_sync 系统变量改为ON ;写入缓冲区的大小由 select_into_buffer_size ;违约是131072(2) 17 ) bytes.

    此外,在同步到磁盘之后,可以使用 select_into_disk_sync_delay ;默认值为无延迟(0毫秒)。

    有关更多信息,请参见此项之前引用的变量说明。

  • 单份发言稿。  截至mysql8.0.22,准备好的语句只准备一次,而不是每次执行一次。在执行时完成 PREPARE .这也适用于存储过程中的任何语句;在首次执行存储过程时,将编写一次语句。

    这一变化的结果之一是,解决准备好的报表中使用的动态参数的方式也改变了,其方式如下:

    • 准备好的语句参数在编写语句时被指定为数据类型;该类型为该语句的每次后续执行持续存在(除非重新编写语句;见下文)。

      在第一次执行之后,在为执行语句而准备的语句中使用特定参数或用户变量的不同数据类型可能导致重新准备语句;因此,在重新执行准备的语句时,最好使用相同的数据类型。

    • 为了与SQL标准保持一致,使用窗口函数的下列构造不再被接受:

      • NTILE(NULL)

      • NTH_VALUE(expr, NULL)

      • LEAD(expr, nn) 和 ,在哪里 是一个负数 LAG(expr, nn)nn

      这有助于更好地遵守SQL标准。有关进一步细节,请参阅单个功能说明。

    • 在准备好的语句中引用的用户变量现在在准备语句时已经确定了它的数据类型;该类型为该语句的每次后续执行持久。

    • 存储过程中发生的语句引用的用户变量现在已经在执行语句的第一次时确定了它的数据类型;对于包含存储过程的任何后续调用,该类型将继续存在。

    • 在执行表格的备妥声明时 ,传递整数值 因为参数不再导致结果的排序 第 选择列表中的表达式;结果不再是有序的,正如预期的 . SELECT expr1expr2, ... FROM table ORDER BY ?NNORDER BY constant

    只需在准备好的语句或存储过程中编写一次语句,就能提高报表的性能,因为这会抵消重复准备的额外费用。这样做也避免了准备结构可能出现的多次回滚,而这种回滚是mysql中许多问题的来源。

    详情请参阅 第13.5.1节,"准备说明" .

  • 右连接作为左连接操作.  截至mysql8.0.22,服务器处理所有的 RIGHT JOIN 内部作为LEFT JOIN ,排除了在解析时没有完成完全转换的一些特殊情况。

  • 派生条件的触发优化。  Mysql8.0.22(及以后)对已实现派生表的查询实现派生条件下拉。例如: ,在很多情况下,现在有可能把它推到外部 从条件到派生表,在这种情况下导致 . SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constantWHERESELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dt

    以前,如果派生表被物化而未合并,则mysql将整个表物化,然后用WHERE 条件。移动WHERE 使用派生条件推入优化可以减少必须处理的行数,从而减少执行查询所需的时间。

    外部的WHERE 当派生表不使用任何聚合函数或窗口函数时,条件可以直接推到物化派生表。当派生表有一个GROUP BY 不使用任何窗口功能,外部WHERE 可以将条件推到派生表HAVING 条件。…WHERE 当派生表使用窗口函数和外部时,也可以向下推。WHERE 窗口函数中使用的引用列 PARTITION 条款。

    默认情况下启用了派生条件触发,如 optimizer_switch 系统变量的 derived_condition_pushdown 旗子。旗子加在mysql8.0.22中,设置为 on 默认情况下;要禁用特定查询的优化,可以使用 NO_DERIVED_CONDITION_PUSHDOWN 优化提示(也添加在mysql8.0.22中)。如果优化是由于 derived_condition_pushdown 准备off ,您可以使用 DERIVED_CONDITION_PUSHDOWN .

    无法对包含 LIMIT 条款。在mysql8.0.29之前,当查询包含时也不能使用优化 UNION .在mysql8.0.29中,大多数情况下,条件可以被推到联合的两个查询块; 第8.2.2.5节,"派生条件下推优化" ,详情请参阅。

    此外,本身使用子查询的条件不能向下推,而且WHERE 条件不能向下推到派生表,该表也是外部连接的内部表。有关详情及例子,请参阅 第8.2.2.5节,"派生条件下推优化" .

  • 未锁定读取在mysql赠款表上。  对于mysql8.0.22,为了允许在mysql赠款表上并发DML和DDL操作,读取以前在mysql赠款表上获得的行锁定的操作将作为非锁定读取执行。

    目前在mysql赠款表上作为非锁定读取执行的操作包括:

    • SELECT 通过连接列表和子查询读取赠款表数据的语句和其他只读语句,包括 SELECT ... FOR SHARE 语句,使用任何事务隔离级别。

    • 通过连接列表或子查询来读取授予表中的数据,但不使用任何事务隔离级别来修改它们的DML操作。

    详情请参阅 赠款表并发 .

  • 64-bit support for FROM_UNIXTIME(), UNIX_TIMESTAMP(), CONVERT_TZ().  截至mysql8.0.28,函数 FROM_UNIXTIME() , UNIX_TIMESTAMP() ,以及 CONVERT_TZ() 在支持它们的平台上处理64位值。这包括64位的Linux、Macos和Windows版本。

    在兼容的平台上,UNIX_TIMESTAMP() 现在处理值'3001-01-18 23:59:59.999999' UTC,以及 FROM_UNIXTIME() 能将值转换到32536771199.999999秒; CONVERT_TZ() 现在接受不超过的价值观'3001-01-18 23:59:59.999999' 在转换之后。

    这些功能在32位平台上的行为不受这些变化的影响。他们的行为 TIMESTAMP 类型也不受影响(在任何平台上);对于在以后的时间工作 '2038-01-19 03:14:07.999999' ,UTC,使用DATETIME 代之以打字。

    有关更多信息,请参阅刚才讨论的对各个函数的描述。 第12.7节,"日期和时间功能" .

  • 资源分配控制。  从mysql8.0.28开始,您可以通过检查 Global_connection_memory 状况变量。(这个总数不包括系统用户使用的资源,如mysql根。它也不包括任何人的记忆 InnoDB 缓冲池。)

    更新 Global_connection_memory ,有必要设置 global_connection_memory_tracking = 1 ;这是0 默认情况下。你能控制多久 Global_connection_memory 通过设置更新 connection_memory_chunk_size .

    还可以通过设置此处所列的系统变量之一或两个变量,为正常用户设置会话或全局级的内存使用限制,或两者兼顾:

    • connection_memory_limit分配给每个连接的内存量。当任何用户超过此限制时,将拒绝该用户的新查询。

    • global_connection_memory_limit分配给所有连接的内存量。每当超过此限制时,任何常规用户的新查询都会被拒绝。

    这些限制不适用于系统流程或行政账户。

    有关更多信息,请参阅引用变量的描述。

  • 分离的xa事务。  Mysql8.0.29增加对一旦准备好就不再连接到原始连接的LU事务的支持。这意味着它们可以由另一个连接提交或回滚,并且当前会话可以立即启动另一个事务。

    系统变量 xa_detach_on_prepare 控制是否分离xd事务;默认情况是 ON ,这导致所有xd事务被分离。在此情况下,临时表的使用是不允许的。

    详情请参阅 Section 13.3.8.2, “XA Transaction States” .

  • 自动二进制日志清除控制.  Mysql8.0.29加上 binlog_expire_logs_auto_purge 系统变量,它提供一个单一的接口,用于启用和禁用二进制日志的自动清除。这是启用的(ON 默认情况下;若要禁用二进制日志文件的自动清除,请将此变量设置为OFF .

    binlog_expire_logs_auto_purge 一定是 ON 为了进行二进制日志文件的自动清除;此变量的值优先于任何其他服务器选项或变量,包括(但不限于) binlog_expire_logs_seconds .

    环境 binlog_expire_logs_auto_purge 对…没有影响PURGE BINARY LOGS .

  • 条件例程和触发创建语句。  从mysql8.0.29开始,以下语句支持IF NOT EXISTS 备选办法:

    • CREATE FUNCTION

    • CREATE PROCEDURE

    • CREATE TRIGGER

    为了CREATE FUNCTION 在创建存储函数时CREATE PROCEDURE 这个选项可以防止在已经有一个名称相同的例程的情况下发生错误。用于 CREATE FUNCTION 当用于创建可加载函数时,如果已经存在具有该名称的可加载函数,该选项将防止错误。用于CREATE TRIGGER ,如果同一架构和同一表中已经存在具有相同名称的触发器,则该选项防止发生错误。

    这个增强使这些语句的语法与CREATE DATABASE ,CREATE TABLE ,CREATE USER ,以及CREATE EVENT (所有这些都已经支持IF NOT EXISTS ),以及作为IF EXISTS 支持的备选办法DROP PROCEDURE , DROP FUNCTION ,以及 DROP TRIGGER 声明。

    有关更多信息,请参见对指明的SQL语句的描述,以及 功能名称 .另见 17.5.1.7节,"创建表的复制"。..选择性发言" .

  • 包括菲多图书馆升级。  Mysql8.0.30列入的升级 fido2 图书馆(与 authentication_fido 从版本1.5.0到版本1.8.0。

    看 第6.4.1.11节,"FIDO可插入认证" ,详情请参阅。

  • 字符集:特定语言的排序。  以前,当一种以上的语言具有完全相同的排序定义时,mysql只为一种语言实现了排序,这意味着某些语言仅包含在utf8mb4 专用于其他语言的编码。mysql8.0.30(及以后)通过为以前仅由其他语言的特定语言的排序所涵盖的语言提供特定语言的排序来解决这些问题。新校刊所涵盖的语文如下:

    • 挪威人(尼诺斯克)

      挪威人

    • 塞尔维亚语(拉丁字母)

    • 波斯尼亚语(拉丁字母)

    • 保加利亚语的

    • 加利西亚人

    • 蒙古语(西里尔字母)

    米塞尔提供了*_as_cs 和 *_ai_ci 所列每种语言的编码。

    详情请参阅 特定语文的排序 .

  • 如果存在,则忽略未知的用户选项以进行撤销.  Mysql8.0.30实施两个新的选择。 REVOKE 当无法找到或无法分配语句中指定的用户、角色或权限时,可以用来确定语句是否产生错误或警告。这里提供了显示这些新选项位置的非常基本的语法:

    REVOKE [IF EXISTS] privilege_or_role 
        ON object 
        FROM user_or_role [IGNORE UNKNOWN USER]

    IF EXISTS 使一个不成功的 REVOKE 语句提出警告,而不是错误,只要指定的目标用户或角色实际存在,尽管语句中有任何引用到任何无法找到的角色或权限。

    IGNORE UNKNOWN USER 使一个不成功的REVOKE 在无法找到语句中指定的目标用户或角色时,提出警告而不是错误。

    有关详情及例子,请参阅 第13.7.1.8节,"撤销声明" .

  • 生成了看不见的主键。  从mysql8.0.30开始,可以运行复制源服务器,从而将生成的隐形主键(GIPK)添加到任何一个 InnoDB 没有显式主键创建的表。添加到此表中的生成键列定义相当于此处所示内容:

    my_row_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT INVISIBLE PRIMARY KEY

    默认情况下不启用GIPK模式。为了让它成为可能,请设置 sql_generate_invisible_primary_key 服务器系统变量到ON .

    生成的不可见主键通常在语句输出中可见,例如SHOW CREATE TABLE 和SHOW INDEX ,以及在mysql信息架构表中,例如COLUMNS 和 STATISTICS 表格。你可以让他们隐藏在这种情况下,通过设置 show_gipk_in_create_table_and_information_schema 到OFF .

    作为这项工作的一部分 --skip-generated-invisible-primary-key 备选办法增加到 Mysql31- 和 Mysql大泵 排除生成的不可见的主键、列和列值.

    在带或不带主键的表之间进行交换和复制。  在mysql复制中,副本有效地忽略了任何设置。 sql_generate_invisible_primary_key 在源上,这样它不会对复制的表产生影响。mysql8.0.32和以后的版本可以将生成的隐形主键添加到任何一个 InnoDB 表,否则,复制,没有主键。你可以通过调用 CHANGE REPLICATION SOURCE TO ... REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE 在复制品上。

    REQUIRE_TABLE_PRIMARY_KEY_CHECK = GENERATE与mysql组复制不兼容。

    详情请参阅 第13.1.20.11节,"生成隐形主键" .

  • 碰撞--------------------------------------------------------  以前,对于二进制日志方面的意外停止,且如果在服务器执行时发生了这种情况,则xa事务无法完全恢复。 XA PREPARE ,XA COMMIT ,或 XA ROLLBACK,无法保证该服务器能够恢复到正确的状态,可能会使二进制日志中存在未应用的额外xa事务,或遗漏一个或多个已应用的xb事务。从mysql8.0.30开始,这不再是一个问题,无论出于什么原因从复制拓扑中退出的服务器在重新连接时总是可以恢复到一致的xd事务状态。

    已知问题 :当同一事务XID被用于按顺序执行x事务,在执行该事务期间出现中断时XA COMMIT ... ONE PHASE 使用同一XID,在存储引擎中准备好此事务之后,可能再也不可能在二进制日志和存储引擎之间同步状态了。

    详情请参阅 第13.3.8.3节,"对航空航天器交易的限制" .

  • 与联盟共处。  从mysql8.0.31开始,插入式查询表达式的主体可以嵌套到63级,并与UNION .此类查询以前被错误拒绝 ER_NOT_SUPPORTED_YET 但现在允许了。EXPLAIN 此查询的输出如下:

    mysql> EXPLAIN FORMAT=TREE ( 
        ->   (SELECT a, b, c FROM t ORDER BY a LIMIT 3) ORDER BY b LIMIT 2
        -> ) ORDER BY c LIMIT 1\G
    *************************** 1. row ***************************
    EXPLAIN: -> Limit: 1 row(s)  (cost=5.55..5.55 rows=1)
        -> Sort: c, limit input to 1 row(s) per chunk  (cost=2.50 rows=0)
            -> Table scan on   (cost=2.50 rows=0)
                -> Temporary table  (cost=5.55..5.55 rows=1)
                    -> Limit: 2 row(s)  (cost=2.95..2.95 rows=1)
                        -> Sort: b, limit input to 2 row(s) per chunk  (cost=2.50 rows=0)
                            -> Table scan on   (cost=2.50 rows=0)
                                -> Temporary table  (cost=2.95..2.95 rows=1)
                                    -> Limit: 3 row(s)  (cost=0.35 rows=1)
                                        -> Sort: t.a, limit input to 3 row(s) per chunk  (cost=0.35 rows=1)
                                            -> Table scan on t  (cost=0.35 rows=1)
    
    1 row in set (0.00 sec)

    Mysql在崩溃插入式查询表达式的实体时遵循SQL标准语义,因此,更高的外部限制不能覆盖内部更低的限制。例如, (SELECT ... LIMIT 5) LIMIT 10 不能超过5行。

    只有在mysql优化器的解析器执行了它能够进行的任何简化或合并之后,才会施加63级限制。

    详情请参阅 第13.2.11节,"括号查询表达式" .

  • 禁用查询重写。  以前,在使用Rewriter 无论用户是谁,所有的查询都会被改写。在某些情况下,例如在管理系统时,或在应用来自复制源的语句或通过 Mysql31- 或者另一个mysql程序。mysql8.0.31通过实现新的用户权限,为此类问题提供解决方案 SKIP_QUERY_REWRITE ;拥有此特权的使用者所发出的声明被Rewriter 但没有改写。

    还增加了一个新的服务器系统变量 rewriter_enabled_for_threads_without_privilege_checks .准备好OFF ,由线程发出的可改写语句 PRIVILEGE_CHECKS_USER 是 NULL (例如复制应用线程)不会由 Rewriter 普金。默认情况是 ON ,这意味着这些声明被改写。

    详情请参阅 第5.6.4节,"改写器查询重写插件" .

  • 复制过滤的xd语句。  以前的声明 XA START ,XA END ,XA COMMIT ,以及XA ROLLBACK 在使用时被默认数据库过滤 --replicate-do-db 或 --replicate-ignore-db ,这可能导致损失交易。截至mysql8.0.31,在这种情况下,这些语句不会被过滤,不管它们的值是多少。 binlog_format .

  • 复制过滤和权限检查。  从mysql8.0.31开始,在使用复制过滤时,副本不再产生与特权检查或 require_row_format 验证被过滤掉的事件,使过滤掉任何失败验证的事务成为可能。

    由于对过滤过的行的权限检查不再能够导致复制停止,所以副本现在只能接受给定用户已被授予访问权的数据库的部分;只要对数据库这一部分的更新仅以基于行的格式复制,这就是事实。

    这种功能在迁移到mysql热波服务时也可能有用,它来自于内部服务或云服务,这些服务使用表进行管理或输入复制用户无法访问的其他目的。

    详情请参阅 17.2.5节,"服务器如何评价复制过滤规则" ,以及 17.5.1.29节,"复制过程中的副本错误" .

  • 交叉和表操作符除外。  增加对SQL的支持 INTERSECT 和 EXCEPT 表操作员。在哪里a 和 b 代表了查询的结果集,这些操作符的行为如下:

    • a INTERSECT b 只包括出现在两个结果集中的行 a 和 b .

    • a EXCEPT b 只返回结果集中的那些行a 哪一个 不 也出现在 b .

    INTERSECT DISTINCT ,INTERSECT ALL ,EXCEPT DISTINCT ,以及 EXCEPT ALL 都得到支持; DISTINCT 两者都是默认的 INTERSECT 和EXCEPT (这和 UNION ).

    有关详情及例子,请参阅 第13.2.8节,"交叉条款" ,以及 第13.2.4节,"除外条款" .

  • 用户定义的直方图。  从mysql8.0.31开始,可以将列的直方图设置为用户指定的JSON值。这可以使用以下SQL语法来完成:

    ANALYZE TABLE tbl_name 
      UPDATE HISTOGRAM ON col_name
      USING DATA 'json_data'

    此语句创建或覆盖列的直方图 col_name 桌上的 tbl_name 使用直方图的JSON表示 json_data .执行此语句后,您可以通过查询信息模式来验证创建或更新直方图 COLUMN_STATISTICS 像这样的桌子:

    SELECT HISTOGRAM FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
      WHERE TABLE_NAME='tbl_name' 
      AND COLUMN_NAME='col_name';

    返回的列值应该是相同的 json_data 上一次使用的 ANALYZE TABLE 声明。

    在直方图取样过程遗漏被认为重要的值的情况下,这可能是有用的。当这种情况发生时,您可能需要修改直方图或根据完整的数据集设置自己的直方图。此外,从一个大的用户数据集取样和从它建立一个直方图是资源密集的操作,可能会影响用户查询。通过这种增强,直方图生成可以从(主要的)服务器移到副本上执行,然后可以将生成的直方图分配到源服务器上的适当表列上。

    有关详情及例子,请参阅 直方图统计分析 .

  • 服务器构建ID(Linux)。  增加只读的 build_id Linux系统的系统变量,160位SHA1 在编译时生成签名; build_id 是将生成的值转换为十六进制字符串的值,为构建提供唯一的标识符。

    build_id每次mysql启动时都会写入服务器日志。

    如果您从源代码构建mysql,则可以观察到每次重新编译服务器时,这个值都会发生变化。看 第2.8节,"从源头安装mysql" ,详情请参阅。

    这个变量不支持在除Linux之外的其他平台上。

  • 默认解释输出格式.  Mysql8.0.32增加一个系统变量 explain_format 它决定了输出的格式 EXPLAIN 用于获取查询执行计划的语句FORMAT 选择。例如,如果explain_format 是TREE ,然后是任何这样的输出 EXPLAIN 使用树形格式,就像语句指定了 FORMAT=TREE .

    此行为被A中的值集覆盖。 FORMAT 选择。假设 explain_format 准备好 TREE 即使如此, 使用JSON输出格式显示结果。 EXPLAIN FORMAT=JSON stmt

    有关更多信息和示例,请参阅explain_format 系统变量,以及 获取执行计划资料 .同时也暗示了EXPLAIN ANALYZE ;看 通过解释分析获得信息 .

  • 支持笛卡尔SRS。  在我的系统8.0.30之前, ST_TRANSFORM() 功能不支持笛卡尔空间参考系统。在mysql8.0.30及以后的版本中,此功能为流行的视觉化伪墨卡托投影法提供支持,该方法用于WGs84伪墨卡托(SRID3857)。mysql8.0.32及以后支持所有笛卡尔式战略计划,但不包括出口环境战略计划1042、出口环境战略计划1043、出口环境战略计划9816和出口环境战略计划9826。

在mysql8.0中被弃用的特征

下列特性在mysql8.0中被弃用,并可能在未来的系列中被删除。在显示替代品的地方,应用程序应当更新以使用它们。

对于那些在较高的mysql系列中删除了在mysq8中不受欢迎的特性的应用程序,如果从mysq8.0源代码复制到较高系列副本,语句可能会失败,或者对源代码和副本会产生不同的影响。为了避免这些问题,应该修改那些使用8.0中被弃用的特性的应用程序,以避免这些特性,并在可能的情况下使用替代品。

  • 数据库赠款中的通配符。  人物的使用% 和 _ 由于数据库赠款中的通配符在mysq8.0.35时被弃用。您应该期待通配符功能在以后的mysql版本中被删除,并且这些字符总是被当作文字对待,就像它们在任何时候都是这样。 partial_revokes 服务器系统变量是ON .

    此外,处理% 作为一个同义词的服务器localhost 当检查权限现在也被弃用到mysql8.0.35时,因此在未来的mysql版本中会被删除。

  • 在mysql8.0.35和以后的版本中,可移植的FIDO认证被弃用。

  • … --character-set-client-handshake 选项最初是用于从非常古老的mysql版本升级的,现在在mysql8.0.35和后来的mysql8.0版本中被弃用,在这些版本中,每当使用时都会发出警告。您应该期待这个选项在未来的mysql版本中被删除;依赖于这个选项的应用程序应该尽快开始从它移走。

  • …old 和 new 在mysql8.0中,服务器系统变量和相关的服务器选项被弃用,从mysql8.0.35开始。每当设置或读取这些变量时,都会发出警告。由于这些变量注定要在未来的mysql版本中被删除,因此依赖于它们的应用程序应该尽快开始从它们中迁移出去。

  • 传统的审计日志滤波模式被弃用于mysql8.0.34。对于遗留的审计日志过滤系统变量发出新的反对警告。这些被弃用的变量要么是只读的,要么是动态的。

    (Read-only) audit_log_policy 现在在服务器启动时,当值不值时,向mysql服务器错误日志写入一条警告消息ALL (默认值)。

    (Dynamic) audit_log_include_accounts , audit_log_exclude_accounts , audit_log_statement_policy ,以及 audit_log_connection_policy .动态变量根据使用情况打印警告信息:

    • 将一个非非荷兰盾值传递给 audit_log_include_accounts 或 audit_log_exclude_accounts 在mysql服务器启动期间,现在向服务器错误日志写入一条警告消息。

    • 将非默认值传递给 audit_log_statement_policy 或 audit_log_connection_policy 在mysql服务器启动期间,现在向服务器错误日志写入一条警告消息。ALL 是两个变量的默认值。

    • 使用现有值更改 SET 在mysql客户端会话期间,语法现在向客户端日志写入一条警告消息。

    • 坚持使用变量 SET PERSIST 在mysql客户端会话期间,语法现在向客户端日志写入一条警告消息。

  • 在mysql8.0.34及以后, mysql_native_password 验证插件被弃用,如果一个帐户试图使用验证,它现在在服务器错误日志中生成一个反对警告mysql_native_password 作为一种认证方法。

  • …ssl_fips_mode 服务器系统变量, --ssl-fips-mode 客户选择,以及MYSQL_OPT_SSL_FIPS_MODE 选项被弃用,并在未来的mysql版本中被删除。

  • keyring_file 和 keyring_encrypted_file 在我的软件中,这是不受欢迎的。这些钥匙环插件被component_keyring_file 和component_keyring_encrypted_file 组件。有关键环组件和插件的简要比较,请参阅 第6.4.4.1节,"键环组件与键环插件" .

  • 我的数据是8.0.31keyring_oci 在以后的mysql版本中,插入被弃用并可能被删除。相反,考虑使用 component_keyring_oci 存储键环数据的组件(见 第6.4.4.11节,"使用甲骨文云基础结构保险库钥匙环组件" ).

  • utf8mb3 字符集被弃用。请使用utf8mb4 相反。

  • 下列字符集被否决:

    • ucs2 (见 第10.9.4节,"UCS2字符集(UCS-2统一码编码)" )

    • macroman 和macce (见 第10.10.2节,"西欧字符集" ,以及 第10.10.3节,"中欧字符集" )

    • dec (见 第10.10.2节,"西欧字符集" )

    • hp8 (见 第10.10.2节,"西欧字符集" )

    在mysql8.0.28及以后,这些字符集中的任何一组或它们的排序在使用下列两种方式时都会产生不赞成警告:

    • 在启动mysql服务器时 --character-set-server 或 --collation-server

    • 在任何SQL语句中指定时,包括但不限于CREATE TABLE , CREATE DATABASE , SET NAMES ,以及 ALTER TABLE

    你应该用utf8mb4 代替以前列出的任何字符集。

    用户定义的拼贴被弃用。从mysql8.0.33开始,下列任何一种都会导致向日志写入警告:

    • 使用COLLATE 在任何SQL语句中加上用户定义的排序表名称

    • 使用用户定义的排序表的名称collation_server , collation_database ,或 collation_connection .

    您应该期待在以后的mysql版本中删除对用户定义的排序的支持。

  • 因为caching_sha2_password 是mysql8.0中的默认身份验证插件,并提供了 sha256_password 认证插件, sha256_password 被反对;希望在未来的mysql版本中删除它。使用mysql进行身份验证的帐户sha256_password 应该迁移到使用 caching_sha2_password 相反。

  • validate_password 已经重新实现了使用组件基础结构。的插件形式validate_password 仍然可用,但现在已被弃用;希望在未来的mysql版本中删除它。使用该插件的mysql安装应该转换为使用组件。看 第6.4.3.3节,"向密码验证组件过渡" .

  • ENGINE 《公约》条款 ALTER TABLESPACE 和 DROP TABLESPACE 声明被反对。

  • … PAD_CHAR_TO_FULL_LENGTH sql模式被反对。

  • AUTO_INCREMENT 对类型的列不支持FLOAT 和 DOUBLE (以及任何同义词)。考虑移除AUTO_INCREMENT 从这些列中提取属性,或将其转换为整数类型。

  • UNSIGNED 类型列的属性被弃用FLOAT , DOUBLE ,以及 DECIMAL (以及任何同义词)。考虑使用简单的CHECK 而不是限制这样的列。

  • FLOAT(M,D) 和 指定类型列的数字数目 和 (以及任何同义词)是一个非标准的mysql扩展。这一语法不受欢迎。 DOUBLE(M,D)FLOATDOUBLE

  • ZEROFILL 对数字数据类型和整数数据类型的显示宽度属性都反对使用属性。考虑使用其他方法来产生这些属性的效果。例如,应用程序可以使用 LPAD() 功能为达到所需宽度的零点数字,或将格式化的数字存储在CHAR 列柱。

  • 对于字符串数据类型,BINARY 属性是一个非标准的mysql扩展,它是指定二进制(_bin )整理列字符集(如果没有指定列字符集,则整理表默认字符集)。在mysql8.0中,这种非标准使用 BINARY 是因为 utf8mb4 字符集有多个 _bin 因此, BINARY 属性被反对;希望在未来的mysql版本中删除对它的支持。应调整申请,以使用明确的 _bin 我来处理一下。

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

  • 以前的mysql版本支持非标准的速记表达式ASCII 和 UNICODE 分别用于: CHARACTER SET latin1 和 CHARACTER SET ucs2 . ASCII 和UNICODE 反对(mysq8.0.28和以后),现在发出警告。使用CHARACTER SET 相反,在两种情况下。

  • 非标准C型 && , || ,以及 ! 标准SQL的同义词操作符 AND , OR ,以及 NOT 运营商分别被拒绝。使用非标准操作符的应用程序应该调整为使用标准操作符。

    注意事项

    使用|| 会被拒绝除非 PIPES_AS_CONCAT 启用了sql模式。在这种情况下,|| 签名标准字符串连接操作符)。

  • …JSON_MERGE() 不赞成行使职能。使用 JSON_MERGE_PRESERVE() 相反。

  • SQL_CALC_FOUND_ROWS 询问修饰语及其伴随语FOUND_ROWS() 不赞成行使职能。看到 FOUND_ROWS() 关于替代策略的信息说明。

  • 支持TABLESPACE = innodb_file_per_table 和TABLESPACE = innodb_temporary 有 CREATE TEMPORARY TABLE 已经被弃用了8.0.13。

  • 为了SELECT 报表,使用INTO 后面的条款 FROM 但不是在最后 SELECT 在我的8.20.20中被否决了。最好是把 INTO 在声明的结尾。

    为了UNION 语句,这两个变体包含INTO 不赞成采用mysq8.20.20:

    • 在查询表达式的后面的查询块中,使用INTO 在…之前 FROM .

    • 在查询表达式的括号大小的跟踪块中,使用INTO ,不论其相对于FROM .

    看 Section 13.2.13.1, “SELECT ... INTO Statement” ,以及 第13.2.18节,"工会条款" .

  • FLUSH HOSTS 在mysq8.0.23中被弃用。相反,截断性能架构 host_cache 表:

    TRUNCATE TABLE performance_schema.host_cache;

    …TRUNCATE TABLE 手术需要DROP 为餐桌准备的特权。

  • … Mysql_升级的 客户因其升级系统表的能力而被拒绝。mysql 其他模式中的系统架构和对象已经移动到mysql服务器中。看 第2.10.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 已经设置好了,但是那些设置已经被弃用了。用于中继日志信息日志和源信息日志的文件已经被KRASSAFE副本表所取代,这是mysql8.0中的默认值。

  • … max_length_for_sort_data 系统变量现在由于优化器的更改而被弃用,这些更改使得它已经过时,没有任何效果。

  • 这些用于压缩连接到服务器的遗留参数被弃用: --compress 客户命令行选项; MYSQL_OPT_COMPRESS 备选办法 mysql_options() CAPI功能; slave_compressed_protocol 系统变量。有关参数的信息请参阅 第4.2.8节,"连接压缩控制" .

  • 使用MYSQL_PWD 指定mysql密码的环境变量被弃用。

  • 使用VALUES() 在 INSERT ... ON DUPLICATE KEY UPDATE 在我的8.20.20中被否决了。取而代之的是新的行和列使用别名。

  • 因为指定ON ERROR 在…之前 ON EMPTY 当援引时 JSON_TABLE() 与SQL标准相反,这种语法现在在mysql中被弃用。从mysq8.20.20开始,当您试图这样做时,服务器会打印一个警告。在一个单独的条款中指定这两个条款JSON_TABLE() 召唤,确保ON EMPTY 先使用。

  • 具有索引前缀的列从未被支持为表的分区键的一部分;以前,在创建、修改或升级已分区的表时允许使用这些列,但被表的分区函数排除在外,服务器没有发出发生这种情况的警告。这种允许行为现在已被弃用,并将在未来的mysql版本中删除,其中在分区键中使用任何这样的列将导致CREATE TABLE 或ALTER TABLE 其中的声明会被拒绝。

    对于mysql8.0.21,每当使用索引前缀的列被指定为分区键的一部分时,每个这样的列都会生成警告。无论何时 CREATE TABLE 或 ALTER TABLE 语句被拒绝,因为在拟议的分区键中的所有列都有索引前缀,由此产生的错误现在提供了拒绝的准确原因。无论是哪种情况,这包括分区函数中使用的列通过使用空键隐式地定义为表主键中的列的情况。 PARTITION BY KEY() 条款。

    有关详情及例子,请参阅 不支持键分区的列索引前缀 .

  • 由于mysql8.0.22的使用,因诺布存储的插件被弃用了;希望在未来的mysql版本中删除对它的支持。

  • …temptable_use_mmap 变量被弃用于mysql8.0.26;希望在未来的mysql版本中删除对它的支持。

  • …BINARY 操作符在mysql8.0.27中被弃用,您应该期待在未来的mysql版本中删除它。使用 BINARY 现在引起警告。使用 CAST(... AS BINARY) 相反。

  • … default_authentication_plugin 变量被弃用于mysql8.0.27;希望在未来的mysql版本中删除对它的支持。

    … default_authentication_plugin 在mysql8.0.27中,变量仍然使用,但与新的结合和优先级相比,它的优先级较低。 authentication_policy 系统变量,在mysql8.0.27中引入具有多因素身份验证功能的系统变量。详情请参阅 默认身份验证插件 .

  • …--abort-slave-event-count 和 --disconnect-slave-event-count 由mysql测试套件使用且通常不用于生产的服务器选项被弃用于mysq8.0.29;期望在未来的mysql版本中删除这两个选项。

  • …myisam_repair_threads 系统变量和 米桑切克 --parallel-recover 选项被弃用于mysql8.0.29;期望在未来的mysql版本中删除对两者的支持。

    从mysql8.0.29,1(默认值)以外的值 myisam_repair_threads 做出警告。

  • 以前,mysql接受 DATE , TIME , DATETIME ,以及 TIMESTAMP 含有任意数目的分隔符字符的文字,以及DATETIME 和 TIMESTAMP 在日期和时间段之前、之后和之间有任意数量的空格字符的文字。对于mysql8.0.29,每当文字值包含下列任何内容时,服务器就会提出反对警告:

    • 一个或多个非标准分隔符字符

    • 多余分隔符字符

    • 除了空间角色(", 0x20 )

    • 超空间字符

    每个时间值发出一个反对警告,即使它有多个问题。此警告不会在严格的模式下提升到错误,因此执行 INSERT 当严格的模式生效时,这种价值仍然会成功.

    您应该期待在未来的mysql版本中删除非标准行为,并且现在就采取步骤确保您的应用程序不依赖于它。

    看 在日期和时间上下文中的字符串和数字文字 ,以了解更多资料和例子。

  • …replica_parallel_type 系统变量及其相关的服务器选项 --replica-parallel-type 是不赞成我的。从这个版本开始,读取或设置这个值会引起一个反对警告;希望在未来的mysql版本中删除它。

  • 从mysql8.0.30开始,设置 replica_parallel_workers 系统变量(或等价的服务器选项)被弃用为0,并引发警告。当您希望复制使用单线程时,请使用 replica_parallel_workers=1 相反,它产生了相同的结果,但没有警告。

  • …--skip-host-cache 以mysql8.0.30开头,服务器选项将被弃用;期待在未来的mysql版本中删除它。使用 host_cache_size 系统变量。

  • …--old-style-user-limits 备选方案是为了与非常古老的(5.0.3前)版本的向后兼容性,在mysql8.0.30时被弃用;现在使用它会引起警告。您应该期待这个选项在以后的mysql版本中被删除。

  • … innodb_log_files_in_group 和innodb_log_file_size 变量在mysql8.0.30时被弃用。这些变量被 innodb_redo_log_capacity 变量。详情请参阅 第15.6.5节,"重做日志" .

  • 截至mysql8.0.32, “ 充分地 ” 由于未引用的标识符是SQL标准中的一个保留关键字,因此被弃用。这意味着这样的声明CREATE TABLE full (c1 INT, c2 INT) 现在提出警告(ER_WARN_DEPRECATED_TO_BE_REMOVED_IDENT_FULL )。为了防止这种情况的发生,请更改名称,或者,如图所示,将其插在背面(` ):

    CREATE TABLE `full` (c1 INT, c2 INT);

    详情请参阅 第9.3节,"关键词和保留词" .

  • 从mysql8.0.32开始,使用美元符号($ )因为未引用标识符的前导字符被弃用并产生警告。这种用法在以后的mysql版本中会被删除。这包括作为数据库名称、表、视图、列或存储程序的标识符,以及其中任何一个的别名。美元符号仍可用作所引用标识符的第一个字符。看 第9.2节,"模式对象名称" ,详情请参阅。

  • …binlog_format 服务器系统变量在mysql8.0.34中被弃用,并在以后的版本中被删除。改变二进制日志的格式,也会被弃用,期望 binlog_format 将留下基于行的二进制日志记录,在mysql8.0中已经是默认的,作为唯一使用或支持的二进制日志格式。因此,新的mysql安装应该使用  基于行的二进制日志记录;使用现有复制设置 binlog_format=STATEMENT 或 binlog_format=MIXED 记录格式应该迁移到基于记录的格式。

    系统变量 log_bin_trust_function_creators 和 log_statements_unsafe_for_binlog ,专门用于基于声明的日志记录和复制。由于这个原因,它们现在也被弃用,并在以后的mysql版本中被删除。

    设定或选择 binlog_format , log_bin_trust_function_creators ,或 log_statements_unsafe_for_binlog 在mysql8.0.34及以后提高警告。

  • … Mysql大泵 客户端实用程序以mysql8.0.34开头被弃用,并在调用时产生弃用警告。这个程序将在以后的mysql版本中被删除。因为mysql提供了执行数据库转储和备份具有相同或额外功能的其他方法,包括 Mysql31- 和 Mysql炮弹 ,这个程序现在被认为是多余的。

    相关的 LZ4_减压机 和 零压机 公用事业也被弃用于mysql8.0.34。

  • 使用没有空格字符的版本编号后(或注释结束)将被弃用到mysql8.0.34,并会引起警告。这句话用mysql8.0.34或更晚的语言提出警告,如图所示:

    mysql> CREATE TABLE t1(a INT, KEY (a)) /*!50110KEY_BLOCK_SIZE=1024*/ ENGINE=MYISAM;
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    mysql> SHOW WARNINGS\G
    *************************** 1. row ***************************
      Level: Warning
       Code: 4164
    Message: Immediately starting the version comment after the version number is
    deprecated and may change behavior in a future release. Please insert a
    white-space character after the version number.  
    1 row in set (0.00 sec)

    为避免此类警告,请在版本号后插入一个或多个空格字符,如:

    mysql> CREATE TABLE t2(a INT, KEY (a)) /*!50110 KEY_BLOCK_SIZE=1024*/ ENGINE=MYISAM;
    Query OK, 0 rows affected (0.00 sec)

    另见 Section 9.7, “Comments” .

  • 我的数据是8.0.34 sync_relay_log_info 系统变量及其对等服务器启动选项被弃用 --sync-relay-log-info .您应该期待对这个变量的支持,以及在文件中存储复制应用程序元数据的支持,在未来的mysql版本中删除。建议您在此之前更新可能依赖于此的任何mysql应用程序。

  • … binlog_transaction_dependency_tracking 服务器系统变量在mysql8.0.35时被弃用,并在未来的mysql版本中被删除。引用这个变量或等价物 MysqDD 启动选项 --binlog-transaction-dependency-tracking 现在触发警告。没有计划替换这个变量或它的功能,预计这个功能以后将成为服务器的内部功能。

在mysql8.0中删除的特征

下列项目已经过时,并已在mysq8.0中删除。在显示替代品的地方,应用程序应当更新以使用它们。

对于使用在mysql8.0中删除的特性的mysql5.7应用程序,如果从mysql5.7源代码复制到mysql8.0副本,语句可能会失败,或者可能对源代码和副本产生不同的影响。为了避免这些问题,应该修改使用mysq8.0中删除的特性的应用程序,以避免这些特性,并在可能的情况下使用替代方法。

  • innodb_locks_unsafe_for_binlog 系统变量被删除.…READ COMMITTED 隔离级别提供了类似的功能。

  • information_schema_stats 在mysql8.0.0中引入的变量被删除,代之以 information_schema_stats_expiry in MySQL 8.0.3.

    information_schema_stats_expiry 定义缓存的过期设置 INFORMATION_SCHEMA 表中统计数字。详情请参阅 第8.2.3节,"优化信息_架构查询" .

  • 与过期有关的守则InnoDB 在mysql8.0.3中删除了系统表。 INFORMATION_SCHEMA 基于InnoDB 系统表被数据字典表的内部系统视图所取代。受影响的 InnoDB INFORMATION_SCHEMA 意见重新命名:

    表1.1改名为Innodb信息架构视图

    旧名 新名称
    INNODB_SYS_COLUMNS INNODB_COLUMNS
    INNODB_SYS_DATAFILES INNODB_DATAFILES
    INNODB_SYS_FIELDS INNODB_FIELDS
    INNODB_SYS_FOREIGN INNODB_FOREIGN
    INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
    INNODB_SYS_INDEXES INNODB_INDEXES
    INNODB_SYS_TABLES INNODB_TABLES
    INNODB_SYS_TABLESPACES INNODB_TABLESPACES
    INNODB_SYS_TABLESTATS INNODB_TABLESTATS
    INNODB_SYS_VIRTUAL INNODB_VIRTUAL

    升级到mysq8.3.3或以后,更新引用以前的脚本InnoDB INFORMATION_SCHEMA 查看名称。

  • 删除了与账户管理有关的下列功能:

    • 使用GRANT 创造用户。相反,使用CREATE USER .根据这一做法 NO_AUTO_CREATE_USER sql模式对于GRANT 语句,因此它也被删除,当服务器日志中存在此值时,现在就写入了一个错误。sql_mode 选项文件中的选项防止 MysqDD 从一开始。

    • 使用GRANT 修改权限分配以外的帐户属性.这包括身份验证、SSL和资源限制属性。相反,在开设账户的时间内建立这类财产。CREATE USER 或修改后用 ALTER USER .

    • IDENTIFIED BY PASSWORD 'auth_string' 语法的CREATE USER 和GRANT .相反,使用 为了 和 ,在哪里 值是与指定的插件兼容的格式。 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 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_CACHE SELECT 修饰词。

    这些被弃用的查询缓存项仍然被弃用,但没有效果;希望在未来的mysql版本中删除它们:

    • SQL_NO_CACHE SELECT 修饰词。

    • ndb_cache_check_time 系统变量。

    have_query_cache 系统变量仍然被弃用,并且总是有一个值 NO 希望在未来的mysql版本中删除它。

  • 数据字典提供了关于数据库对象的信息,因此服务器不再检查数据目录中的目录名称来寻找数据库。因此, --ignore-db-dir 备选办法和 ignore_db_dirs 系统变量是不相干的,被删除。

  • DDL日志(又称元数据日志)已被删除。从mysq8.0.3开始,数据字典处理此功能 innodb_ddl_log 表看 查看DDL日志 .

  • tx_isolation 和 tx_read_only 系统变量被删除。使用transaction_isolation 和 transaction_read_only 相反。

  • sync_frm 系统变量被删除是因为.frm 文件已经过时。

  • secure_auth 系统变量和 --secure-auth 客户选项已被删除。…MYSQL_SECURE_AUTH 备选办法mysql_options() 删除了CAPI函数。

  • 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 系统变量或用作 Mysql31- --compatible 选择。

    移走MAXDB 意味着 TIMESTAMP 数据类型 CREATE TABLE 或 ALTER TABLE 会被当作 TIMESTAMP ,不再被当作DATETIME .

  • 反对者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_CRYPT 木棉 选择。

    代替删除的加密功能: ENCRYPT() ,考虑使用 SHA2() 取而代之的是单向购物。其他人,考虑使用 AES_ENCRYPT() 和 AES_DECRYPT() 相反。

  • 在mysql5.7中,多个名称下可用的几个空间函数被反对,以使空间函数名称空间更加一致,目标是每个空间函数名称以ST_ 如果它执行了一个精确的操作,或者MBR 如果它执行基于最小边界矩形的操作。在mysql8.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节,"用WGB值创建几何值的函数" 以前接受W2B字符串或几何参数。几何参数不再允许,并产生错误.关于从使用几何参数转移查询的指南,请参阅该节。

  • 分析器不再治疗\N 作为一个同义词NULL 在SQL语句中。使用 NULL 相反。

    此更改不影响文本文件导入或导出操作LOAD DATA 或 SELECT ... INTO OUTFILE ,为此NULL 仍然由\N .看 第13.2.9节,"装载数据报表" .

  • 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 选项仍然可用,但在mysq8.0.26版本中被弃用,并在未来的mysql版本中被删除。)

    对于C原料药,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 系统变量被删除.

  • 服务器不再执行将含有特殊字符的前MISQL5.1数据库名称转换为5.1格式的转换,并添加#mysql50# 前缀。因为这些转换不再执行,所以 --fix-db-names 和 --fix-table-names 备选办法 Mysql31- ……UPGRADE DATA DIRECTORY NAME 《公约》条款 ALTER DATABASE 声明和声明Com_alter_db_upgrade 状态变量被删除.

    只支持从一个主要版本到另一个版本的升级(例如5至5.1,或5.1至5.5),因此不需要将旧的5.0数据库名转换为当前的mysql版本。作为一种变通办法,在升级到更新的版本之前,将mysql5.00安装升级为mysql5.1。

  •  Mysql_31-all_db 方案已从mysql分布版中删除。应通过调用来执行数据目录初始化 MysqDD 与… --initialize 或 --initialize-insecure 而不是选择。此外,--bootstrap 选择 MysqDD 它被用来 Mysql_31-all_db 已经移走了 INSTALL_SCRIPTDIR CMake 控制安装位置的选项 Mysql_31-all_db 已经移走了。

  • 通用分区处理程序从mysql服务器上删除。为了支持给定表的分区,表使用的存储引擎现在必须提供自己的( “ 本土的 ” )分区处理程序。… --partition 和 --skip-partition 从mysql服务器中删除了选项,与分区相关的条目不再显示在SHOW PLUGINS 或在信息架构中 PLUGINS 表

    两个mysql存储引擎目前提供本地分区支持:InnoDB 和NDB .其中,只有 InnoDB 在mysql8.0中支持。任何使用其他存储引擎在mysq8.0中创建分区表的尝试都失败了。

    升级的核查。  使用存储引擎直接升级分区表InnoDB (例如 MyISAM )从mysql5.7(或更早)到mysql8.0不支持。处理这种表格有两种选择:

    • 删除表的分区,使用 ALTER TABLE ... REMOVE PARTITIONING .

    • 将表格所用的存储引擎改为 InnoDB ,以及 ALTER TABLE ... ENGINE=INNODB .

    以上列出的两个操作中至少有一个必须为每个分区的非分区操作执行InnoDB 将服务器升级为mysql8.0之前的表。否则,在升级之后不能使用此表。

    由于表创建语句将导致使用存储引擎进行分区表,而没有分区支持,因此现在出现错误( ER_CHECK_NOT_IMPLEMENTED ),您必须确保转储文件中的任何语句(例如 Mysql31- )您希望导入到创建分区表的mysq8.0服务器中的一个旧版本的mysql也没有指定存储引擎,例如: MyISAM 没有本地分区处理程序。你可以通过以下两种方式之一来做到这一点:

    • 删除对分区的任何引用 CREATE TABLE 使用一个值的语句STORAGE ENGINE 其他选择InnoDB .

    • 指明储存引擎为 InnoDB ,或允许 InnoDB 默认用作表的存储引擎。

    详情请参阅 24.6.2节,"与存储引擎有关的分区限制" .

  • 系统和状态变量信息不再保留于INFORMATION_SCHEMA .这些表格删除: GLOBAL_VARIABLES , SESSION_VARIABLES , GLOBAL_STATUS , SESSION_STATUS .使用相应的性能架构表代替。看 第27.12.14节,"性能模式系统变量表" ,以及 第27.12.15节,"性能模式状态变量表" .此外,show_compatibility_56 系统变量被删除.系统和状态可变信息在过渡时期使用。INFORMATION_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_COM31- --libmysqld-libs , --embedded-libs ,以及 --embedded 选择权

    •  木棉 WITH_EMBEDDED_SERVER , WITH_EMBEDDED_SHARED_LIBRARY ,以及 INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR 选择权

    • (无证件) Mysql --server-arg 选择

    •  Mysql31- --embedded-server , --server-arg ,以及 --server-file 选择权

    •  Mysqltest_嵌入的 和 mysql_client_test_embedded 测试程序

  •  Mysql_31-kin 有用的东西被拿走了。其他选择包括在服务器启动时使用--plugin-load 或 --plugin-load-add 选择,或在运行时使用INSTALL PLUGIN 声明。

  •  解决方案 有用的东西被拿走了。 国家统计局调查 , 主人 ,或 挖掘 可以代替。

  •  分解_堆积_沉淀物 有用的东西被拿走了。官方mysql构建的堆栈跟踪总是符号化的,因此不需要使用 分解_堆积_沉淀物 .

  • 下面的服务器错误代码没有使用,已经删除.应该更新专门测试这些错误的应用程序。

    ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
    ER_BINLOG_ROW_RBR_TO_SBR
    ER_BINLOG_ROW_WRONG_TABLE_DEF
    ER_CANT_ACTIVATE_LOG
    ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
    ER_CANT_CREATE_FEDERATED_TABLE
    ER_CANT_CREATE_SROUTINE
    ER_CANT_DELETE_FILE
    ER_CANT_GET_WD
    ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
    ER_CANT_SET_WD
    ER_CANT_WRITE_LOCK_LOG_TABLE
    ER_CREATE_DB_WITH_READ_LOCK
    ER_CYCLIC_REFERENCE
    ER_DB_DROP_DELETE
    ER_DELAYED_NOT_SUPPORTED
    ER_DIFF_GROUPS_PROC
    ER_DISK_FULL
    ER_DROP_DB_WITH_READ_LOCK
    ER_DROP_USER
    ER_DUMP_NOT_IMPLEMENTED
    ER_ERROR_DURING_CHECKPOINT
    ER_ERROR_ON_CLOSE
    ER_EVENTS_DB_ERROR
    ER_EVENT_CANNOT_DELETE
    ER_EVENT_CANT_ALTER
    ER_EVENT_COMPILE_ERROR
    ER_EVENT_DATA_TOO_LONG
    ER_EVENT_DROP_FAILED
    ER_EVENT_MODIFY_QUEUE_ERROR
    ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
    ER_EVENT_OPEN_TABLE_FAILED
    ER_EVENT_STORE_FAILED
    ER_EXEC_STMT_WITH_OPEN_CURSOR
    ER_FAILED_ROUTINE_BREAK_BINLOG
    ER_FLUSH_MASTER_BINLOG_CLOSED
    ER_FORM_NOT_FOUND
    ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
    ER_FRM_UNKNOWN_TYPE
    ER_GOT_SIGNAL
    ER_GRANT_PLUGIN_USER_EXISTS
    ER_GTID_MODE_REQUIRES_BINLOG
    ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
    ER_HASHCHK
    ER_INDEX_REBUILD
    ER_INNODB_NO_FT_USES_PARSER
    ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
    ER_LOAD_DATA_INVALID_COLUMN_UNUSED
    ER_LOGGING_PROHIBIT_CHANGING_OF
    ER_MALFORMED_DEFINER
    ER_MASTER_KEY_ROTATION_ERROR_BY_SE
    ER_NDB_CANT_SWITCH_BINLOG_FORMAT
    ER_NEVER_USED
    ER_NISAMCHK
    ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
    ER_NO_FILE_MAPPING
    ER_NO_GROUP_FOR_PROC
    ER_NO_RAID_COMPILED
    ER_NO_SUCH_KEY_VALUE
    ER_NO_SUCH_PARTITION__UNUSED
    ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
    ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
    ER_ORDER_WITH_PROC
    ER_PARTITION_SUBPARTITION_ERROR
    ER_PARTITION_SUBPART_MIX_ERROR
    ER_PART_STATE_ERROR
    ER_PASSWD_LENGTH
    ER_QUERY_ON_MASTER
    ER_RBR_NOT_AVAILABLE
    ER_SKIPPING_LOGGED_TRANSACTION
    ER_SLAVE_CHANNEL_DELETE
    ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
    ER_SLAVE_MUST_STOP
    ER_SLAVE_WAS_NOT_RUNNING
    ER_SLAVE_WAS_RUNNING
    ER_SP_GOTO_IN_HNDLR
    ER_SP_PROC_TABLE_CORRUPT
    ER_SQL_MODE_NO_EFFECT
    ER_SR_INVALID_CREATION_CTX
    ER_TABLE_NEEDS_UPG_PART
    ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
    ER_UNEXPECTED_EOF
    ER_UNION_TABLES_IN_DIFFERENT_DIR
    ER_UNSUPPORTED_BY_REPLICATION_THREAD
    ER_UNUSED1
    ER_UNUSED2
    ER_UNUSED3
    ER_UNUSED4
    ER_UNUSED5
    ER_UNUSED6
    ER_VIEW_SELECT_DERIVED_UNUSED
    ER_WRONG_MAGIC
    ER_WSAS_FAILED
  • 反对者INFORMATION_SCHEMA INNODB_LOCKS 和 INNODB_LOCK_WAITS 把桌子移开。使用性能架构 data_locks 和 data_lock_waits 代替表格。

    注意事项

    在mysql5.7中,LOCK_TABLE 列于INNODB_LOCKS 表和 locked_table 列于 sys 图解 innodb_lock_waits 和 x$innodb_lock_waits 视图包含合并的模式/表名称值。在我的8.0里,data_locks 表和 sys 架构视图包含单独的架构名称和表名称列.看 第28.4.3.9节,"因诺兹-洛克-瓦茨和X元-洛克-瓦茨视图" .

  • InnoDB 不再支持压缩临时表。何时 innodb_strict_mode 启用(默认), CREATE TEMPORARY TABLE 如果 ROW_FORMAT=COMPRESSED 或 KEY_BLOCK_SIZE 是指定的。如果 innodb_strict_mode 禁用、发布警告和使用非压缩行格式创建临时表。

  • InnoDB 不再创造 .isl 档案(InnoDB 当在mysql数据目录之外创建表空间数据文件时。… innodb_directories 选项现在支持定位数据目录之外创建的表空间文件。

    通过此更改,通过手动修改 .isl 文件不再被支持。移动远程表空间文件现在由 innodb_directories 选择。看 15.6.3.6节,"服务器脱机时移动表空间文件" .

  • 以下内容InnoDB 删除了文件格式变量:

    • innodb_file_format

    • innodb_file_format_check

    • innodb_file_format_max

    • innodb_large_prefix

    文件格式变量对于创建与以前版本的 InnoDB 在我的第5.1条里。既然mysql5.1已经到了产品生命周期的末尾,这些选项就不再需要了。

    FILE_FORMAT 列被从INNODB_TABLES 和 INNODB_TABLESPACES 信息模式表。

  • innodb_support_xa 删除了系统变量,该变量能够支持fd事务中的两阶段提交。InnoDB 始终启用对xa事务中的两阶段提交的支持。

  • 支持的数据被移除。

  • JSON_APPEND() 功能被删除。使用JSON_ARRAY_APPEND() 相反。

  • 支持在共享中放置表分区 InnoDB 在mysql8.0.13中删除了平板空间。共享表空间包括 InnoDB 系统表空间和一般表空间。有关在共享表空间中识别分区并将其移至每个表表空间的信息,请参阅 第2.10.5节,"准备安装升级" .

  • 支持在语句中设置用户变量 SET 在mysql8.0.13中被拒绝了。这个功能可以在mysql8.4中删除。

  • --ndb 使惊愕 取消了备选办法。使用 恩德布_佩罗 实际上是有用的。

  • innodb_undo_logs 变量被删除。… innodb_rollback_segments 变量执行相同的功能,应该被使用.

  • Innodb_available_undo_logs 状态变量被删除。可用的每个表空间回滚段的数目可以使用SHOW VARIABLES LIKE 'innodb_rollback_segments';

  • 截至mysq8.0.14,先前反对的 innodb_undo_tablespaces 变量不再是可配置的。详情请参阅 第15.6.3.4节,"撤销表空间" .

  • 支助ALTER TABLE ... UPGRADE PARTITIONING 声明已经删除。

  • 截至mysql8.0.16,支持 internal_tmp_disk_storage_engine 系统变量已被删除;磁盘上的内部临时表现在总是使用 InnoDB 存储引擎。看 磁盘内部临时表存储引擎 ,详情请参阅。

  •  木棉 备选办法没有使用,已被删除。 DISABLE_SHARED

  • …myisam_repair_threads 系统变量从mysql8.0.30移除。

你可能感兴趣的:(服务器,运维,mysql,数据库)