Allin Program

从MySQL 5.7到8.0,普通开发者应当了解的变化

在关系型数据库中,我更偏向于使用PostgreSQL,而在国内业界中MySQL更受欢迎。
作为一名使用MySQL的普通开发者,我认为至少应当了解从MySQL 5.7到8.0的以下变化。

MySQL 8.0 中添加的功能

支持角色以及引入了用户帐户类别的概念

这些新特性能够更好的保护数据库,避免用户有意无意中破坏数据库。不论是个人开发者还是SRE在配置账号的时候都可以考虑使用该特性分配账号。

系统表和数据字典表创建位置

算是对《高性能 MySQL》(第3版)的补充

mysql系统表和数据字典表现在是在mysql数据目录中的一个名为mysql.ibd的InnoDB表空间文件中创建的。
以前这些表在mysql数据库目录中的各个InnoDB表空间文件中创建。

增强Online DDL

腾讯团队贡献的代码,太强了。

优化Redo Log

面试还可能会问到。

更改默认字符集

默认字符集已从latin1更改为utf8mb4

增强JSON支持

涉及点较多,建议直接参考官方文档。

数据类型支持

现在支持使用表达式作为数据类型规范中的默认值。
包括使用表达式作为 BLOB、 TEXT、 GEOMETRY和 JSON数据类型的默认值,而以前根本无法为其分配默认值。

如:

CREATE TABLE t1 (
  -- literal defaults
  i INT         DEFAULT 0,
  c VARCHAR(10) DEFAULT '',
  -- expression defaults
  f FLOAT       DEFAULT (RAND() * RAND()),
  b BINARY(16)  DEFAULT (UUID_TO_BIN(UUID())),
  d DATE        DEFAULT (CURRENT_DATE + INTERVAL 1 YEAR),
  p POINT       DEFAULT (Point(0,0)),
  j JSON        DEFAULT (JSON_ARRAY())
);

不可见索引

现在支持不可见索引(Invisible index),即优化器不使用的索引。
可以通过这个特性在不进行破坏性更改的前提下,完成测试删除索引对查询性能的影响。

内部临时表

  1. TempTable取代MEMORY成为内存内部临时表(Internal temporary tables)的默认存储引擎。
  2. 从 MySQL 8.0.16 开始,MySQL 仅使用InnoDB为磁盘内部临时表的存储引擎,不再支持MYISAM存储引擎 。

备份锁

新型备份锁(Backup lock)允许在线备份期间执行DML,同时防止可能导致快照不一致的操作。

插件

现在只能用C++编写。

Redo Log归档

在备份操作进行期间,复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的速度,从而导致由于这些记录被覆盖而丢失重做日志记录。重做日志归档功能通过将重做日志记录顺序写入归档文件来解决此问题。备份实用程序可以根据需要从存档文件中复制重做日志记录,从而避免潜在的数据丢失。

RIGHT JOIN作为LEFT JOIN处理

从 MySQL 8.0.22 开始,服务器RIGHT JOIN在内部将所有实例处理为LEFT JOIN,从而消除了许多在解析时未执行完整转换的特殊情况。

派生条件下推

如:

SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > constant;
-- 👇
SELECT * FROM (SELECT i, j FROM t1 WHERE i > constant) AS dt;

XA事务

XA事务分离

MySQL 8.0.29添加了对XA事务的支持,这些事务一旦准备好,就不再连接到原始连接。这意味着它们可以由另一个连接提交或回滚,并且当前会话可以立即开始另一个事务。

崩溃安全(Crash-safe)的 XA 事务

以前,XA事务不能完全适应二进制日志的意外停止,如果在服务器执行XA准备、XA提交或XA回滚时发生这种情况,则不能保证服务器能够恢复到正确的状态,可能会使二进制日志中留下尚未应用的额外XA事务,或者丢失一个或多个已应用的XA事务。从MySQL 8.0.30开始,这不再是一个问题,无论出于什么原因退出复制拓扑的服务器在重新加入时总能恢复到一致的XA事务状态。

已知问题:当使用同一个事务XID顺序执行XA事务并且在执行过程中发生COMMIT ... ONE PHASE,在存储引擎中准备好该事务后,可能无法再同步二进制日志和存储引擎之间的状态。

MySQL 8.0 中已弃用的功能

FLOAT和DOUBLE类型与AUTO_INCREMENT

建议从此类列中删除AUTO_INCREMENT 属性,或将它们转换为整数类型。

分隔符

以前,MySQL 接受 包含任意数量(任意)分隔符的DATETIMEDATETIMETIMESTAMP,现在服务器都会发出弃用警告。那些喜欢用String传值干入数据库时间类型的多多注意。

MySQL 8.0 中删除的功能

查询缓存已被删除

DDL 日志(也称为元数据日志)已被删除

系统变量tx_isolation与tx_read_only被删除

使用transaction_isolationtransaction_read_only代替。

系统和状态变量信息不再维护在INFORMATION_SCHEMA

删除XA事务中两阶段提交选项

删除了支持 XA 事务中两阶段提交的系统变量innodb_support_xa,InnoDB始终启用对XA事务中两阶段提交的支持。