在MySQL5.7中,所有的临时表都被创建在一个叫“ibtmp1”的表空间中。另外,临时表的元数据也将存储在内存中(不再存储在frm文件中)。
在MySQL8.0中,使用临时表存储引擎作为临时表(为优化JOIN、UNION等操作而创建的)存储的默认引擎,从而替换掉了原有的内存存储引擎。新的引擎使得VARCHAR和VARBINARY列的存储更为高效(所有存储空间得到完全分配)。
MySQL8.0现在可以设置变量并使其改变持续到服务器重新启动。我博客的另外一篇文章详细阐述了这一特性。()。
使用此语法结合新的RESTART命令,可以非常容易的从shell中配置MySQL。这对云计算用户是一个十分友好的功能。
由于采用了新的本地数据字典,现在我们不在需要MyISAM系统表了!这些表和数据字典表现在都在一个名为mysql.idb的InNoDB表空间文件中。这意味着如果你没有明确使用MyISAM表(为了你的数据,我们并不这样做),你可以创建一个没有任何MyISAM表的MySQL实例。
在MySQL5.7中,我们已经可以截断UNDO空间了(设置innodb_undo_log_truncate,默认情况下禁用)。在MySQL8中,我们改进了磁盘格式来使得每个UNDO表有大量的UNDO段。此外,现在默认为两个单独的UNDO表空间(而非InnoDB系统表空间(最小为2,大小动态变化))中创建UNDO段。我们不推荐使用innodb_undo_tablespaces来设置该值,因为我们将提供SQL命令让数据库管理员与UNDO表空间进行交互。
由于默认的字符集已经从latin1改为utf8mb4,因此现在UTF8的速度要快得多,在特定查询时速度提高了1800%! Emojis现在无处不在,MySQL当然是选择支持他啦!
我在性能审计中的第一件事就是禁用Query Cache,因为它给设计带来了很多麻烦。 MySQL QC造成的问题比它解决问题要多的多。因此我们决定在MySQL 8.0中取消它,因为大家就不应该使用它。 如果您的工作负载需要Query Cache,那么您应该改用ProxySQL替代Query Cache。
由于采用了新的数据字典,MySQL 8.0现在支持原子数据定义语句(原子DDL)。 这意味着当执行DDL时,数据字典更新,存储引擎操作以及二进制日志中的写入操作会合并到单个原子事务中,该事务要么完全执行,要么根本不执行。 这提高了DDL的稳定性未完成的DDL不会留下任何不完整的数据。
得益于假索引的存在,像SELECT * FROM sys.session这样的查询速度提高了30倍。 查询尽可能避免进行表扫描,并且索引的使用可大大缩短执行时间。 除此之外,Performance Schema还提供语句延迟的直方图。 新的直方图也使得优化器更为高效。
MySQL 8.0中添加了SQL角色功能。 角色是指定的拥有特定权限的集合。 像用户帐户一样,角色可以拥有授予和撤消的权限。 角色可以默认或采用session修改。 也可强制设置角色。
在MySQL 5.7中,可以为存储在每个表中的表加密InnoDB表空间。 在MySQL 8.0中,我们通过为UNDO和REDO日志添加加密来完成此功能。
除此以外,还有很多改进我没有列完。 还有很多其他不错的功能。 我想在下面再列出一些我认为重要的(尽管所有的改进都很重要)