本节总结了 MySQL 5.6 中添加、弃用和删除的内容。配套部分列出了在 MySQL 5.6 中添加、弃用或删除的 MySQL 服务器选项和变量;请参阅 第 1.4 节,“MySQL 5.6 中添加、弃用或删除的服务器和状态变量和选项”。
MySQL 5.6 中增加了以下特性:
安全改进。 进行了以下安全改进:
MySQL 现在提供了一种方法,用于存储在名为
.mylogin.cnf
. 要创建该文件,请使用mysql_config_editor实用程序。稍后 MySQL 客户端程序可以读取该文件以获得用于连接到 MySQL 服务器的身份验证凭据。mysql_config_editor 写入.mylogin.cnf
文件使用加密,因此凭据不会以明文形式存储,并且当客户端程序解密时,其内容仅在内存中使用。通过这种方式,密码可以以非明文格式存储在文件中并在以后使用,而无需在命令行或环境变量中公开。有关详细信息,请参阅 第 4.6.6 节,“mysql_config_editor — MySQL 配置实用程序”。MySQL 现在支持对用户帐户密码进行更强大的加密,可通过名为的身份验证插件
sha256_password
实现 SHA-256 密码散列。这个插件是内置的,所以它总是可用的,不需要显式加载。有关更多信息,包括创建使用 SHA-256 密码的帐户的说明,请参阅 第 6.4.1.4 节,“SHA-256 可插入身份验证”。mysql.user
系统表现在有一 列password_expired
。它的默认值为'N'
,但可以'Y'
使用新ALTER USER
语句设置为。帐户密码过期后,在后续使用该帐户连接到服务器时执行的所有操作都会导致错误,直到用户发出SET PASSWORD
建立新帐户密码的语句。有关详细信息,请参阅 第 13.7.1.1 节,“ALTER USER 语句”和 第 6.2.10 节,“服务器处理过期密码”。MySQL 现在有检查密码安全性的规定:
在分配作为明文值提供的密码的语句中,根据当前密码策略检查该值,如果它很弱则拒绝(该语句返回
ER_NOT_VALID_PASSWORD
错误)。这会影响CREATE USER
、GRANT
和SET PASSWORD
语句。PASSWORD()
作为和 函数的参数给出的密码OLD_PASSWORD()
也会被检查。可以使用新的
VALIDATE_PASSWORD_STRENGTH()
SQL 函数评估潜在密码的强度,该函数采用密码参数并返回 0(弱)到 100(强)之间的整数。
这两种功能都由
validate_password
插件实现。有关详细信息,请参阅第 6.4.3 节 “密码验证插件”。如果 mysql_upgrade 发现用户帐户的密码使用较早的 4.1 之前的散列方法进行散列,则mysql_upgrade现在会发出警告。应更新此类帐户以使用更安全的密码哈希。请参阅 第 6.1.2.4 节,“MySQL 中的密码散列”
在 Unix 平台上,mysql_install_db 支持一个新选项,
--random-passwords
它提供更安全的 MySQL 安装。调用mysql_install_db会--random-passwords
导致它为 MySQLroot
帐户分配一个随机密码,为这些帐户设置 “密码过期”标志,并删除匿名用户 MySQL 帐户。有关其他详细信息,请参阅 第 4.4.3 节,“mysql_install_db — 初始化 MySQL 数据目录”。日志记录已被修改,因此密码不会以明文形式出现在写入一般查询日志、慢速查询日志和二进制日志的语句中。请参阅 第 6.1.2.3 节,“密码和日志记录”。
mysql客户端不再记录引用密码的历史文件语句 。请参阅 第 4.5.1.3 节,“mysql 客户端日志记录”。
START SLAVE
语法已被修改以允许指定连接参数以连接到源。这提供了将密码存储在master.info
文件中的替代方法。请参阅 第 13.4.2.5 节,“START SLAVE 语句”。MySQL 现在将命名管道上授予客户端的访问控制设置为在 Windows 上成功通信所需的最低限度。较新的 MySQL 客户端软件无需任何额外配置即可打开命名管道连接。如果不能立即升级旧的客户端软件,可以
named_pipe_full_access_group
使用新的系统变量为 Windows 组提供打开命名管道连接所需的权限。完全访问组的成员资格应该是受限制的和临时的。
MySQL 企业版。 审计日志插件生成的文件格式已更改,以便更好地与 Oracle Audit Vault 兼容。请参阅第 6.4.4 节,“MySQL 企业审计”和 第 6.4.4.3 节,“审计日志文件格式”。
MySQL 企业版中包含的审计日志插件现在可以根据用户帐户和事件状态过滤审计事件。几个新的系统变量为 DBA 提供了过滤控制。此外,通过添加多个状态变量,审核日志插件报告功能得到了改进。有关详细信息,请参阅 第 6.4.4.4 节“配置审计日志记录特征”和 审计日志插件状态变量。
MySQL 企业版现在包括一组基于 OpenSSL 库的加密函数,这些函数在 SQL 级别公开 OpenSSL 功能。这些功能使企业应用程序能够执行以下操作:
使用公钥非对称加密实现额外的数据保护
创建公钥和私钥以及数字签名
执行非对称加密和解密
使用加密哈希进行数字签名以及数据验证和确认
有关详细信息,请参阅 第 6.5 节,“MySQL 企业加密”。
MySQL Enterprise Edition 现在包括 MySQL Enterprise Firewall,这是一个应用程序级防火墙,使数据库管理员能够根据与接受的语句模式的白名单进行匹配来允许或拒绝 SQL 语句的执行。这有助于加强 MySQL 服务器抵御 SQL 注入等攻击,或试图通过在合法查询工作负载特征之外使用它们来利用应用程序。有关详细信息,请参阅 第 6.4.5 节,“MySQL 企业防火墙”。
更改服务器默认设置。 从 MySQL 5.6.6 开始,几个 MySQL 服务器参数默认值与以前版本中的默认值不同。这些更改的动机是提供更好的开箱即用性能并减少数据库管理员手动更改设置的需要。有关详细信息,请参阅第 5.1.2.1 节,“对服务器默认值的更改”。
InnoDB 增强功能。 添加了这些
InnoDB
增强功能:您可以在表上创建
FULLTEXT
索引 ,并使用 语法InnoDB
查询它们。MATCH() ... AGAINST
此功能包括一个新的邻近搜索运算符 (@
) 和几个新的配置选项和INFORMATION_SCHEMA
表:有关更多信息,请参阅 第 14.6.2.3 节,“InnoDB 全文索引”。ALTER TABLE
可以在不复制表、不阻塞对表的插入、更新和删除或两者的情况下执行 多个操作。这些增强功能统称为在线 DDL。有关详细信息,请参阅第 14.13 节,“InnoDB 和在线 DDL”。InnoDB
现在支持语句的 子句,它允许在数据目录之外创建表。此增强功能提供了在更适合您的服务器环境的位置创建表的灵活性。例如,您可以将繁忙的表放在SSD 设备上,或将大表放在大容量 HDD设备上。DATA DIRECTORY='
directory
'CREATE TABLE
有关详细信息,请参阅 第 14.6.1.2 节,“在外部创建表”。
InnoDB
现在支持 “可传输表空间”的概念,允许 每个表的文件表 空间(.ibd
文件)从一个正在运行的 MySQL 实例中导出并导入到另一个正在运行的实例中,而不会因缓冲数据、正在进行的事务和内部数据而导致不一致或不匹配簿记详细信息,例如空间 ID和 LSN。该命令的
FOR EXPORT
子句FLUSH TABLE
将任何未保存的更改从InnoDB
内存缓冲区 写入.ibd
文件。.ibd
将文件和一个单独的元数据文件复制 到另一台服务器后,语句的DISCARD TABLESPACE
andIMPORT TABLESPACE
子句ALTER TABLE
用于将表数据带入不同的 MySQL 实例。此增强功能提供了移动驻留在 file-per-table 表空间中的表的灵活性, 以更好地适应您的服务器环境。例如,您可以将繁忙的表移动到SSD设备,或将大表移动到大容量 HDD设备。有关详细信息,请参阅第 14.6.1.3 节,“导入 InnoDB 表”。
您现在可以将未压缩表的
InnoDB
页面大小设置为 8KB 或 4KB,以替代默认的 16KB。此设置由innodb_page_size
配置选项控制。您在创建 MySQL 实例时指定大小。 一个实例中的所有InnoDB
表空间共享相同的页面大小。较小的页面大小有助于避免某些工作负载和存储设备组合的冗余或低效 I/O,尤其是 块大小较小的SSD设备。自适应刷新 算法的改进 使 I/O 操作在各种 工作负载下更加高效和一致。新算法和默认配置值有望为大多数用户提高性能和并发性。高级用户可以通过几个配置选项微调他们的 I/O 响应能力。有关详细信息,请参阅 第 14.8.3.4 节,“配置缓冲池刷新”。
您可以编写
InnoDB
通过 NoSQL 风格的 API 访问表的 MySQL 应用程序。此功能使用流行的 memcached守护进程来中继诸如ADD
、SET
和GET
键值对之类的请求。这些存储和检索数据的简单操作避免了 SQL 开销,例如解析和构建 查询执行计划. 您可以通过 NoSQL API 和 SQL 访问相同的数据。例如,您可以使用 NoSQL API 进行快速更新和查找,使用 SQL 进行复杂查询并与现有应用程序兼容。有关详细信息,请参阅第 14.20 节,“InnoDB memcached 插件”。表的优化器统计信息
InnoDB
以更可预测的时间间隔收集,并且可以在服务器重新启动后保持不变,以提高 计划的稳定性。您还可以控制对InnoDB
索引进行的采样量,以使优化器统计信息更加准确并改进查询执行计划。有关详细信息,请参阅 第 14.8.11.1 节,“配置持久优化器统计参数”。新的优化适用于只读 事务,提高了临时查询和报告生成应用程序的性能和并发性。这些优化会在可行时自动应用,或者您可以指定
START TRANSACTION READ ONLY
以确保事务是只读的。有关详细信息,请参阅 第 8.5.3 节,“优化 InnoDB 只读事务”。您可以将
InnoDB
撤消日志从 系统表空间移出到一个或多个单独 的表空间中。撤消日志的 I/O 模式使这些新表空间成为迁移到 SSD 存储的良好候选者,同时将系统表空间保留在硬盘存储上。有关详细信息,请参阅第 14.6.3.3 节,“撤消表空间”。InnoDB
您可以通过指定配置选项 来提高校验和功能的效率innodb_checksum_algorithm=crc32
,这会打开更快的校验和算法。此选项替换innodb_checksums
选项。使用旧校验和算法(选项值innodb
)写入的数据完全向上兼容;使用新校验和算法(选项值crc32
)修改的表空间不能降级到不支持该innodb_checksum_algorithm
选项的早期版本的 MySQL。InnoDB
重做日志文件 的最大组合大小从 4GB 增加到 512GB。innodb_log_file_size
您可以通过该选项指定较大的值 。innodb_log_file_size
启动行为现在会自动处理现有重做日志文件的大小与 和 指定的大小不匹配的情况innodb_log_files_in_group
。该
--innodb-read-only
选项允许您以只读模式运行 MySQL 服务器。您可以访问InnoDB
只读介质(如 DVD 或 CD)上的表,或者设置一个包含多个实例的数据仓库,这些实例都共享同一个数据目录。有关使用详细信息,请参阅 第 14.8.2 节,“为只读操作配置 InnoDB”。新的配置选项 允许您从熟悉的 0-9 范围内为压缩表
innodb_compression_level
选择 压缩 级别。您还可以控制当更新操作导致页面再次被压缩时,缓冲池中的压缩页面是否存储在重做日志中。此行为由 配置选项控制。InnoDB
zlib
innodb_log_compressed_pages
InnoDB
压缩表中的 数据块包含一定量的空白空间(填充)以允许DML在不重新压缩新值的情况下修改行数据的操作。过多的填充会增加压缩失败的可能性,当数据在大量更改后确实需要重新压缩时,需要进行页面拆分。现在可以动态调整填充量,这样 DBA 就可以降低压缩失败率,而无需使用新参数重新创建整个表,或者使用不同的页面大小重新创建整个实例。相关的新配置选项是innodb_compression_failure_threshold_pct
,innodb_compression_pad_pct_max
。几个新的
InnoDB
相关INFORMATION_SCHEMA
表提供了有关InnoDB
缓冲池的信息、有关表的元数据、索引和InnoDB
数据字典中的外键,以及有关性能指标的低级信息,这些信息补充了 Performance Schema 表中的信息。为了减轻具有大量表的系统上的内存负载,
InnoDB
现在使用 LRU 算法释放与打开的表关联的内存,以选择未访问时间最长的表。要为打开的表保留更多内存来保存元数据InnoDB
,请增加table_definition_cache
配置选项的值。InnoDB
将此值视为 数据字典缓存中打开表实例数的“软限制” 。InnoDB
有关其他信息,请参阅table_definition_cache
文档。InnoDB
有几个内部性能增强,包括通过拆分内核互斥锁减少争用,将刷新操作从主线程移动到单独的线程,启用多个清除线程,以及减少大内存系统上缓冲池的争用。InnoDB
使用一种新的、更快的算法来检测 死锁。有关所有InnoDB
死锁的信息都可以写入 MySQL 服务器错误日志,以帮助诊断应用程序问题。为避免 重启服务器后的预热时间过长,尤其是对于具有大
InnoDB
缓冲池的实例,您可以在重启后立即将页面重新加载到缓冲池中。MySQL 可以在关闭时转储一个紧凑的数据文件,然后查询该数据文件以找到 要在下次重新启动时重新加载的页面。您还可以随时手动转储或重新加载缓冲池,例如在基准测试期间或复杂的报告生成查询之后。请参阅 第 14.8.3.5 节,“保存和恢复缓冲池状态”了解详情。从 MySQL 5.6.16 开始,innochecksum 支持大于 2GB 的文件。以前,innochecksum只支持最大 2GB 的文件。
从 MySQL 5.6.16 开始,新的全局配置参数
innodb_status_output
和innodb_status_output_locks
允许您动态启用和禁用标准InnoDB
Monitor 和InnoDB
Lock Monitor 以进行定期输出。通过创建和删除特殊命名的表来启用和禁用定期输出的监视器已被弃用,并且可能会在未来的版本中删除。有关其他信息,请参阅 第 14.17 节,“InnoDB 监视器”。从 MySQL 5.6.17 开始, 在线 DDL 支持扩展到对常规表和分区
InnoDB
表的以下操作:ALTER TABLE ... ENGINE=INNODB
(在InnoDB
桌子上运行时)在线 DDL 支持减少了表重建时间并允许并发 DML。请参阅 第 14.13 节,“InnoDB 和在线 DDL”。
从 MySQL 5.6.42 开始,与 MySQL 捆绑的 zlib 库 版本从 1.2.3 版本提升到 1.2.11 版本。MySQL 在 zlib 库的帮助下实现压缩。
如果您使用
InnoDB
压缩表,请参阅第 2.11.3 节,“MySQL 5.6 中的更改”以了解相关的升级影响。
分区。 添加了这些表分区增强功能:
分区的最大数量增加到 8192。这个数量包括表的所有分区和所有子分区。
现在可以使用该
ALTER TABLE ... EXCHANGE PARTITION
语句将分区表的分区或子分区表的子分区与具有相同结构的非分区表进行交换。例如,这可用于导入和导出分区。有关更多信息和示例,请参阅 第 19.3.3 节,“使用表交换分区和子分区”。现在支持对一个或多个分区或子分区的显式选择,以用于查询,以及许多作用于分区表的数据修改语句。例如,假设一个
t
包含一些整数列 的表c
有 4 个分区,分别命名为p0
、p1
、p2
和p3
。然后查询仅返回分区中 小于 5 的SELECT * FROM t PARTITION (p0, p1) WHERE c < 5
那些行。p0
p1
c
以下语句支持显式分区选择:
有关语法,请参阅各个语句的说明。有关其他信息和示例,请参阅 第 19.5 节,“分区选择”。
分区锁修剪通过帮助消除不受这些语句影响的分区上的锁,极大地提高了许多作用于具有许多分区的表的 DML 和 DDL 语句的性能。此类语句包括许多
SELECT
,SELECT ... PARTITION
,UPDATE
,REPLACE
,INSERT
以及许多其他语句。有关更多信息,包括性能因此得到改进的语句的完整列表,请参阅 第 19.6.4 节,“分区和锁定”。
性能模式。 性能模式包括几个新特性:
表输入和输出的检测。检测操作包括对持久基表或临时表的行级访问。影响行的操作是获取、插入、更新和删除。
根据模式和/或表名按表过滤事件。
按线程过滤事件。为线程收集更多信息。
表和索引 I/O 以及表锁的汇总表。
语句中的语句和阶段的检测。
在服务器启动时配置仪器和消费者,这以前只能在运行时进行。
MySQL NDB 集群。 MySQL NDB Cluster 作为单独的产品发布;最新的 GA 版本基于 MySQL 5.6 并使用 7.3 版的
NDB
存储引擎。集群支持在主线 MySQL Server 5.6 版本中不可用。有关 MySQL NDB Cluster 7.3 的更多信息,请参阅 第 18 章,MySQL NDB Cluster 7.3 和 NDB Cluster 7.4。目前最新的开发版本是MySQL NDB Cluster 7.4,基于7.4版本的NDB
存储引擎和 MySQL Server 5.6。MySQL NDB Cluster 7.4 目前可用于测试和评估。可以从https://mysql.net.cn/downloads/cluster/获得最新的 MySQL NDB Cluster 7.4 版本。有关 MySQL NDB Cluster 7.4 中所做改进的更多信息和概述,请参阅 第 18.2.4.2 节,“NDB Cluster 7.4 中的新增功能”。
MySQL NDB Cluster 7.2(之前的 GA 版本)基于 MySQL Server 5.5,但我们建议新部署使用 MySQL NDB Cluster 7.3。
复制和记录。 添加了这些复制增强功能:
MySQL 现在支持使用 全局事务标识符(也称为 “ GTID ”)的基于事务的复制。这使得识别和跟踪每个事务成为可能,当它在原始服务器上提交时以及它被任何副本应用时。
在复制设置中启用 GTID 主要是使用新 变量
gtid_mode
和enforce_gtid_consistency
系统变量完成的。有关为支持 GTID 而引入的其他选项和变量的信息,请参阅第 17.1.4.5 节,“全局事务 ID 选项和变量”。使用 GTID 时,在启动新副本或故障转移到新源时无需参考日志文件或这些文件中的位置,这大大简化了这些任务。有关使用或不使用二进制日志文件为 GTID 复制配置服务器的更多信息,请参阅 第 17.1.3.3 节,“使用 GTID 进行故障转移和横向扩展”。
基于 GTID 的复制是完全基于事务的,这使得检查源和副本的一致性变得简单。如果在给定源上提交的所有事务也在给定副本上提交,则可以保证两个服务器之间的一致性。
有关 MySQL 复制中 GTID 的实现和使用的更完整信息,请参阅 第 17.1.3 节,“使用全局事务标识符复制”。
MySQL 基于行的复制现在支持行图像控制。通过仅记录为每行更改(而不是所有列)唯一标识和执行更改所需的那些列,可以节省磁盘空间、网络资源和内存使用量。
binlog_row_image
您可以通过将服务器系统变量设置为值之一minimal
(仅记录必需的列)、full
(记录所有列)或noblob
(记录除不需要BLOB
或 列之外的所有列)来确定是记录完整行还是最少行TEXT
。看 与二进制日志记录一起使用的系统变量,了解更多信息。MySQL 服务器写入和读取的二进制日志现在是崩溃安全的,因为只有完整的事件(或事务)才会被记录或回读。默认情况下,服务器会记录事件的长度以及事件本身,并使用此信息来验证事件是否已正确写入。
binlog_checksum
您还可以通过设置系统变量使服务器使用 CRC32 校验和为事件写入校验和 。要使服务器从二进制日志中读取校验和,请使用master_verify_checksum
系统变量。这--slave-sql-verify-checksum
系统变量导致副本 SQL 线程从中继日志中读取校验和。MySQL 现在支持将源连接信息和副本中继日志信息记录到表和文件中。这些表的使用可以通过 系统变量
master_info_repository
和relay_log_info_repository
系统变量独立控制。设置master_info_repository
为TABLE
会导致连接信息记录到slave_master_info
表中。设置relay_log_info_repository
为TABLE
会导致中继日志信息记录到slave_relay_log_info
表中。这两个表都是在mysql
系统数据库中自动创建的。为了使复制能够对意外停止具有弹性,
slave_master_info
和slave_relay_log_info
表必须各自使用事务存储引擎,并且从 MySQL 5.6.6 开始,这些表是InnoDB
出于这个原因创建的。(错误 #13538891)如果您使用的是以前的 MySQL 5.6 版本,其中这两个表都使用MyISAM
,这意味着,在开始复制之前,您必须将它们都转换为事务存储引擎(例如InnoDB
) 如果您希望复制对意外停止具有弹性。在这种情况下,您可以通过适当的ALTER TABLE ... ENGINE=...
语句来执行此操作。当复制实际运行时,您不应 尝试更改这些表中的任何一个使用的存储引擎。有关详细信息,请参阅 第 17.3.2 节,“处理副本服务器的意外停止”。
mysqlbinlog现在能够以其原始二进制格式备份二进制日志。当使用
--read-from-remote-server
和--raw
选项调用时, mysqlbinlog连接到服务器,请求日志文件,并以与原始格式相同的格式写入输出文件。请参阅 第 4.6.8.3 节,“使用 mysqlbinlog 备份二进制日志文件”。MySQL 现在支持延迟复制,这样副本服务器就会故意落后于源服务器至少一段指定的时间。默认延迟为 0 秒。使用新
MASTER_DELAY
选项CHANGE MASTER TO
设置延迟。延迟复制可用于防止用户在源上犯错(DBA 可以将延迟的副本回滚到灾难发生之前的时间)或测试系统在出现延迟时的行为方式等目的。请参阅 第 17.3.10 节,“延迟复制”。
MASTER_BIND
现在可以通过在发出CHANGE MASTER TO
语句 时 使用该选项,使具有多个网络接口的副本仅使用其中一个(排除其他接口) 。添加了
log_bin_basename
系统变量。此变量包含二进制日志文件的完整文件名和路径。而log_bin
系统变量仅显示是否启用二进制日志记录,log_bin_basename
反映了使用--log-bin
服务器选项设置的名称。同样,
relay_log_basename
系统变量显示中继日志文件的文件名和完整路径。MySQL 复制现在支持在副本上使用多线程并行执行事务。启用并行执行时,副本 SQL 线程充当多个副本工作线程的协调器,具体数量由
slave_parallel_workers
服务器系统变量。副本上多线程的当前实现假定数据和更新在每个数据库的基础上进行分区,并且给定数据库内的更新以与源上相同的相对顺序发生。但是,没有必要协调不同数据库之间的事务。然后事务也可以按数据库分布,这意味着副本上的工作线程可以处理给定数据库上的连续事务,而无需等待对其他数据库的更新完成。由于不同数据库上的事务在副本上的发生顺序可能与在源上的顺序不同,因此仅检查最近执行的事务并不能保证源上的所有先前事务都已在副本上执行。这对使用多线程副本时的日志记录和恢复有影响。有关在副本上使用多线程时如何解释二进制日志记录信息的信息,请参阅 第 13.7.5.35 节,“SHOW SLAVE STATUS 语句”。
优化器增强功能。 实施了这些查询优化器改进:
优化器现在可以更有效地处理以下形式的查询(和子查询):
SELECT ... FROM single_table ... ORDER BY non_index_column [DESC] LIMIT [M,]N;
这种类型的查询在仅显示较大结果集中的几行的 Web 应用程序中很常见。例如:
SELECT col1, ... FROM t1 ... ORDER BY name LIMIT 10; SELECT col1, ... FROM t1 ... ORDER BY RAND() LIMIT 15;
排序缓冲区的大小为
sort_buffer_size
. 如果行的排序元素N
足够小以适合排序缓冲区(如果指定了M
+N
行M
),服务器可以避免使用合并文件并完全在内存中执行排序。有关详细信息,请参阅 第 8.2.1.16 节,“LIMIT 查询优化”。优化器实现磁盘扫描多范围读取。当表很大且未存储在存储引擎的缓存中时,使用二级索引上的范围扫描读取行可能会导致对基表的许多随机磁盘访问。通过磁盘扫描多范围读取 (MRR) 优化,MySQL 尝试通过首先仅扫描索引并收集相关行的键来减少范围扫描的随机磁盘访问次数。然后对键进行排序,最后使用主键的顺序从基表中检索行。Disk-sweep MRR 的动机是减少随机磁盘访问的次数,而是实现对基表数据的更顺序扫描。有关详细信息,请参阅 第 8.2.1.10 节,“多范围读取优化”。
优化器实现索引条件下推 (ICP),这是针对 MySQL 使用索引从表中检索行的情况的优化。如果没有 ICP,存储引擎会遍历索引以定位基表中的行,并将它们返回给 MySQL 服务器,MySQL 服务器会评估这些
WHERE
行的条件。在启用 ICP 的情况下,如果WHERE
仅使用索引中的字段可以评估部分条件,则 MySQL 服务器会推送这部分条件WHERE
条件下降到存储引擎。然后,存储引擎使用索引条目评估推送的索引条件,只有在满足条件时才会读取基行。ICP 可以减少存储引擎必须对基表执行的访问次数以及 MySQL 服务器必须对存储引擎执行的访问次数。有关详细信息,请参阅 第 8.2.1.5 节,“索引条件下推优化”。该
EXPLAIN
语句现在提供DELETE
、INSERT
、REPLACE
和UPDATE
语句的执行计划信息。以前,仅为报表EXPLAIN
提供信息 。SELECT
此外,该EXPLAIN
语句现在可以生成 JSON 格式的输出。请参阅 第 13.8.2 节,“EXPLAIN 语句”。优化器更有效地处理
FROM
子句中的子查询(即派生表)。子句中子查询的具体化FROM
被推迟到查询执行期间需要它们的内容时,这提高了性能。此外,在查询执行期间,优化器可能会向派生表添加索引以加快从中检索行的速度。有关详细信息,请参阅 第 8.2.2.4 节,“优化派生表”。优化器使用半连接和物化策略来优化子查询执行。请参阅 第 8.2.2.1 节,“使用半连接转换优化子查询”和 第 8.2.2.2 节,“使用物化优化子查询”。
Batched Key Access (BKA) 连接算法现在可用,它使用对连接表的索引访问和连接缓冲区。BKA算法支持内连接、外连接和半连接操作,包括嵌套外连接和嵌套半连接。BKA 的好处包括由于更有效的表扫描而提高了连接性能。有关详细信息,请参阅 第 8.2.1.11 节,“阻止嵌套循环和成批密钥访问连接”。
优化器现在具有跟踪功能,主要供开发人员使用。该接口由一组 系统变量和 表提供。有关详细信息,请参阅 MySQL 内部结构:跟踪优化器。
optimizer_trace_
xxx
INFORMATION_SCHEMA.OPTIMIZER_TRACE
条件处理。 MySQL 现在支持该
GET DIAGNOSTICS
语句。GET DIAGNOSTICS
为应用程序提供了一种从诊断区域获取信息的标准化方式,例如先前的 SQL 语句是否产生了异常以及它是什么。有关详细信息,请参阅 第 13.6.7.3 节,“GET DIAGNOSTICS 语句”。此外,纠正了条件处理程序处理规则中的几个缺陷,使 MySQL 的行为更像标准 SQL:
块作用域用于确定选择哪个处理程序。以前,存储程序被视为具有处理程序选择的单一范围。
更准确地解决了条件优先级。
诊断区域清理已更改。错误 #55843 导致在激活处理程序之前从诊断区域清除已处理的条件。这使得条件信息在处理程序中不可用。现在条件信息对处理程序可用,可以用
GET DIAGNOSTICS
语句检查它。如果在处理程序执行期间尚未清除条件信息,则在处理程序退出时清除条件信息。以前,一旦条件发生,处理程序就会被激活。现在它们不会被激活,直到条件发生的语句完成执行,此时选择最合适的处理程序。这对于引发多个条件的语句可能会有所不同,如果在语句执行期间稍后引发的条件比较早的条件具有更高的优先级并且两个条件在相同范围内有处理程序。以前,将选择引发第一个条件的处理程序,即使它的优先级低于其他处理程序。
有关详细信息,请参阅第 13.6.7.6 节,“处理程序的作用域规则”。
数据类型。 这些数据类型更改已实施:
MySQL 现在允许 、 和值的小数秒
TIME
,精度可达微秒(6 位)。请参阅 第 11.2.7 节,“时间值中的小数秒”。DATETIME
TIMESTAMP
以前,
TIMESTAMP
每个表最多一列可以自动初始化或更新为当前日期和时间。此限制已取消。任何TIMESTAMP
列定义都可以具有DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
子句的任意组合。此外,这些子句现在可以与DATETIME
列定义一起使用。有关详细信息,请参阅 第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”。在 MySQL 中,
TIMESTAMP
数据类型在默认值以及自动初始化和更新属性的分配方面与其他数据类型存在非标准差异。explicit_defaults_for_timestamp
这些行为仍然是默认行为,但现在已弃用,并且可以通过在服务器启动时启用系统变量来关闭 。请参阅 第 11.2.6 节,“TIMESTAMP 和 DATETIME 的自动初始化和更新”和 第 5.1.7 节,“服务器系统变量”。
主机缓存。 MySQL 现在提供了有关客户端连接到服务器时发生错误的原因的更多信息,并改进了对主机缓存的访问,其中包含客户端 IP 地址和主机名信息,用于避免 DNS 查找。这些更改已经实施:
新的 状态变量提供有关不适用于特定客户端 IP 地址的连接错误的信息。
Connection_errors_
xxx
计数器已添加到主机缓存以跟踪适用于特定 IP 地址的错误,并且新的
host_cache
性能模式表公开了主机缓存的内容,以便可以使用SELECT
语句对其进行检查。访问主机缓存内容可以回答诸如缓存了多少主机、哪些主机发生了何种连接错误或主机错误计数接近max_connect_errors
系统变量限制等问题。现在可以使用
host_cache_size
系统变量配置主机缓存大小。
有关详细信息,请参阅第 5.1.11.2 节,“DNS 查找和主机缓存”和 第 22.12.10.1 节,“host_cache 表”。
开放地理信息系统。 OpenGIS 规范定义了测试两个几何值之间关系的函数。MySQL 最初实现这些函数时,它们使用对象边界矩形并返回与相应的基于 MBR 的函数相同的结果。现在可以使用使用精确对象形状的相应版本。这些版本以
ST_
前缀命名。例如,Contains()
使用对象边界矩形,而ST_Contains()
使用对象形状。有关详细信息,请参阅 第 12.17.9 节,“测试几何对象之间空间关系的函数”。
MySQL 5.6 中不推荐使用以下功能;您应该期望它们会在以后的系列中被删除。在显示备选方案的地方,应更新应用程序以使用它们。
对于使用 MySQL 5.6 中已弃用且已在更高 MySQL 系列中删除的功能的应用程序,当从 MySQL 5.6 源复制到更高系列副本时,语句可能会失败,或者可能对源和副本产生不同的影响。为避免此类问题,应修改使用 5.6 中弃用功能的应用程序以避免出现此类问题,并尽可能使用替代方案。
、 和 SQL 模式已弃用,将
ERROR_FOR_DIVISION_BY_ZERO
值 设置 为包含其中任何模式都会生成警告。在 MySQL 5.7 中,这些模式什么都不做。相反,它们的效果包含在严格 SQL 模式(或 )的效果中。MySQL 5.7 改变的动机是减少依赖于严格模式的 SQL 模式的数量,并使它们成为严格模式本身的一部分。NO_ZERO_DATE
NO_ZERO_IN_DATE
sql_mode
STRICT_ALL_TABLES
STRICT_TRANS_TABLES
为升级到 MySQL 5.7 做提前准备,请参阅 MySQL 5.7 中的 SQL 模式更改。该讨论提供了评估您的应用程序是否受到 MySQL 5.7 中 SQL 模式更改影响的指南。
不推荐使用 MySQL 5.6 中的隐式
GROUP BY
排序。要实现分组结果的特定排序顺序,最好使用显式ORDER BY
子句。GROUP BY
排序是一个 MySQL 扩展,可能会在未来的版本中改变;例如,使优化器能够以它认为最有效的任何方式对分组进行排序,并避免排序开销。Pre-4.1 密码和
mysql_old_password
身份验证插件。以 MySQL 4.1 之前使用的旧哈希格式存储的密码不如使用本机密码哈希方法的密码安全,应避免使用。4.1 之前的密码和mysql_old_password
身份验证插件现已弃用。为防止使用具有 4.1 之前密码哈希的帐户进行连接,secure_auth
现在默认启用系统变量。(要允许具有此类密码哈希的帐户连接,请使用 启动服务器--secure_auth=0
。但是,由于不推荐使用 4.1 之前的密码,因此也不推荐禁用secure_auth
。)建议 DBA 将使用
mysql_old_password
身份验证插件的帐户转换为使用mysql_native_password
。有关帐户升级说明,请参阅 第 6.4.1.3 节,“从 4.1 版之前的密码哈希和 mysql_old_password 插件迁移”。该
OLD_PASSWORD()
函数生成 4.1 之前的密码哈希值,PASSWORD()
如果old_passwords
系统变量设置为 1 也是如此。OLD_PASSWORD()
并且old_passwords=1
已弃用。--skip-innodb
选项及其同义词(--innodb=OFF
、 等--disable-innodb
)。系统
innodb_locks_unsafe_for_binlog
变量。、和 系统变量
date_format
, 未使用。datetime_format
time_format
、
have_profiling
和 系统变量profiling
。profiling_history_size
和
innodb_use_sys_malloc
系统innodb_additional_mem_pool_size
变量。系统
timed_mutexes
变量。它什么都不做,也没有效果。--language
选项 。请改用--lc-messages-dir
和--lc-messages
选项。的
IGNORE
条款ALTER TABLE
。ALTER IGNORE TABLE
导致复制问题,阻止联机ALTER TABLE
创建唯一索引,并导致外键问题(父表中删除的行)。msql2mysql 、 mysql_convert_table_format、 mysql_find_rows、 mysql_fix_extensions、 mysql_setpermission、 mysql_waitpid、 mysql_zap、 mysqlaccess和mysqlbug实用程序 。
mysqlhotcopy实用程序 。备选方案包括mysqldump和 MySQL Enterprise Backup。
以下项目已过时,已在 MySQL 5.6 中删除。在显示备选方案的地方,应更新应用程序以使用它们。
对于使用 MySQL 5.6 中删除的功能的 MySQL 5.5 应用程序,语句从 MySQL 5.5 源复制到 MySQL 5.6 副本时可能会失败,或者可能对源和副本产生不同的影响。为避免此类问题,应修改使用 MySQL 5.6 中删除的功能的应用程序以避免它们并尽可能使用替代方案。
--log
服务器选项和 系统log
变量。相反,使用general_log
系统变量启用通用查询日志,并使用general_log_file
系统变量设置通用查询日志文件名。系统
log_slow_queries
变量。相反,使用slow_query_log
系统变量来启用慢查询日志和slow_query_log_file
系统变量来设置慢查询日志文件名。--one-thread
服务器选项 。改用--thread_handling=no-threads
。--safe-mode
服务器选项 。--skip-thread-priority
服务器选项 。--table-cache
服务器选项 。请改用table_open_cache
系统变量。和选项、 系统变量和
--init-rpl-role
状态 变量。--rpl-recovery-rank
rpl_recovery_rank
Rpl_status
系统
engine_condition_pushdown
变量。请改用 变量 的engine_condition_pushdown
标志 。optimizer_switch
、
have_csv
、have_innodb
和 系统变量have_ndbcluster
。have_partitioning
而是使用SHOW PLUGINS
或查询 数据库PLUGINS
中的表INFORMATION_SCHEMA
。系统
sql_big_tables
变量。改用big_tables
。系统
sql_low_priority_updates
变量。改用low_priority_updates
。系统
sql_max_join_size
变量。改用max_join_size
。系统
max_long_data_size
变量。改用max_allowed_packet
。和
FLUSH MASTER
语句FLUSH SLAVE
。请改用RESET MASTER
andRESET SLAVE
语句。和
SLAVE START
语句SLAVE STOP
。使用 TheSTART SLAVE
andSTOP SLAVE
语句。和
SHOW AUTHORS
语句SHOW CONTRIBUTORS
。语句 的
OPTION
修饰符ONE_SHOT
。SET
明确不允许将值分配
DEFAULT
给存储过程或函数参数或存储程序局部变量(例如使用语句)。像以前一样,仍然允许分配给系统变量。SET
var_name
= DEFAULTDEFAULT
大多数
SHOW ENGINE INNODB MUTEX
输出在 5.6.14 中被删除。SHOW ENGINE INNODB MUTEX
输出在 MySQL 5.7.2 中被完全删除。可以通过在性能模式表 上创建视图来生成可比较的信息。