MySQL 8.0 新特性集合

官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能!

注意:从 MySQL 5.7 升级到 MySQL 8.0 仅支持通过使用 in-place 方式进行升级,并且不支持从 MySQL 8.0
降级到 MySQL 5.7(或从某个 MySQL 8.0 版本降级到任意一个更早的 MySQL 8.0
版本)。唯一受支持的替代方案是在升级之前对数据进行备份。

下面简要介绍 MySQL 8 中值得关注的新特性和改进。

1. 性能

MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。

MySQL 8.0 在以下方面带来了更好的性能:读/写工作负载、IO 密集型工作负载、以及高竞争("hot spot"热点竞争问题)工作负载。
在这里插入图片描述
2. NoSQL

MySQL 从 5.7 版本开始提供 NoSQL 存储功能,目前在 8.0 版本中这部分功能也得到了更大的改进。该项功能消除了对独立的 NoSQL 文档数据库的需求,而 MySQL 文档存储也为 schema-less 模式的 JSON 文档提供了多文档事务支持和完整的 ACID 合规性。
在这里插入图片描述

3. 窗口函数(Window Functions)

从 MySQL 8.0 开始,新增了一个叫窗口函数的概念,它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种集合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数不需要 GROUP BY。

4.invisible index (不可见索引)
在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用,但是索引还在磁盘,统计信息什么的都在,还会自动继续维护数据。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。

-- 查看有没有invisible的索引:
select index_name,is_visible from information_schema.statistics where table_schema='world' and table_name="city";

在这里插入图片描述


```sql
-- 创建visible索引:
alter table city add index idx(name) visible;
select index_name,is_visible from information_schema.statistics where table_schema='world' and table_name="city";
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324110710640.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTMyMDY2MA==,size_16,color_FFFFFF,t_70)

```sql
-- 修改visible索引为invisible索引:
alter table city alter index idx  invisible;
select index_name,is_visible from information_schema.statistics where table_schema='world' and table_name="city";

在这里插入图片描述

5.倒序索引
MySQL 8.0 为索引提供按降序方式进行排序的支持,在这种索引中的值也会按降序的方式进行排序。


```sql
-- 示例:
select * from city where country=xx order by city asc, num desc;
idx(country,city,num desc)

创建倒序索引 :
alter table city add index idx(country,city,num desc);

6. UTF-8 编码
从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集(之前默认字符集latin1),默认排序规则已从更改latin1_swedish_ci为utf8mb4_800_ci_ai。

默认更改适用于libmysql和服务器命令工具以及服务器本身。

更改还反映在MTR测试中,该测试使用新的默认字符集运行。

增加了对区分大小写和重音的排序规则的支持。MySQL 8.0支持DUCET(默认Unicode排序规则条目表)定义的所有3个级别的排序规则权重。

7.JSON

MySQL 8.0添加了新的JSON函数,并提高了对JSON值进行排序和分组的性能。

JSON路径表达式中范围的扩展语法

MySQL 8.0扩展了JSON路径表达式中范围的语法。例如SELECT
JSON_EXTRACT(’[1, 2, 3, 4, 5]’, ‘$[1 to 3]’);结果[2, 3, 4]。引入的新语法是SQL标准语法的子集,在SQL:2016,9.39 SQL / JSON路径语言:语法和语义中进行了描述。

JSON表功能
MySQL 8.0添加了JSON表功能,该功能允许使用SQL机制处理JSON数据。JSON_TABLE()创建JSON数据的关系视图。它将JSON数据评估的结果映射到关系行和列中。用户可以使用SQL将函数返回的结果查询为常规关系表,例如联接,项目和聚合。

JSON聚合功能
MySQL 8.0添加了聚合函数JSON_ARRAYAGG()来生成JSON数组和JSON_OBJECTAGG()生成JSON对象。这样就可以将多行中的JSON文档组合到JSON数组或JSON对象中。

JSON合并功能
该JSON_MERGE_PATCH()函数实现了RFC7396指定的JavaScript(和其他脚本语言)的语义,即,它以第二个文档的优先级删除重复项。例如,。JSON_MERGE(’{“a”:1,“b”:2 }’,’{“a”:3,“c”:4 }’); # returns {“a”:3,“b”:2,“c”:4}
该JSON_MERGE_PRESERVE()函数具有在MySQL 5.7中实现的JSON_MERGE()的语义,该语义保留了所有值,例如 JSON_MERGE(’{“a”: 1,“b”:2}’,’{“a”:3,“c”:4}’); # returns {“a”:[1,3],“b”:2,“c”:4}.
JSON_MERGE()MySQL 8.0中不推荐使用现有功能,以消除合并操作的歧义。

8.IPV6操作

MySQL 8.0通过支持对BINARY数据类型的按位操作,提高了IPv6操作的可用性。在MySQL 5.6中,我们引入了INET6_ATON()和INET6_NTOA()函数,用于在文本格式(如’fe80::226:b9ff:fe77:eb17’和)之间转换IPv6地址VARBINARY(16)。但是,直到现在我们还不能将这些IPv6功能与按位操作结合使用,因为这样的操作会(错误地)将输出转换为BIGINT。例如,如果我们有一个IPv6地址,并想针对网络掩码对其进行测试,则现在可以使用它, 因为它正确地返回了数据类型(128位)。

9.对二进制数据类型进行按位运算

MySQL 8.0扩展了按位操作(“按位与”等),使其也可与一起使用[VAR]BINARY/[TINY|MEDIUM|LONG]BLOB。在8.0之前的版本中,仅整数支持位操作。如果对二进制文件使用按位运算,则参数会BIGINT在运算之前隐式转换为(64位),因此可能会丢失位。从8.0开始,按位运算适用于所有BINARY和BLOB数据类型,强制转换参数以使位不丢失。

10.UUID操作

MySQL 8.0通过实现三个新的SQL函数UUID_TO_BIN()(BIN_TO_UUID(),和)提高了UUID操作的可用性IS_UUID()。第一个从UUID格式的文本转换为VARBINARY(16),第二个从VARBINARY(16)UUID格式的文本转换,最后一个检查UUID格式的文本的有效性。VARBINARY(16)可以使用功能索引来索引存储为的UUID 。函数UUID_TO_BIN()和UUID_TO_BIN()也可以将与时间相关的位随机播放,并在开始时移动它们,使其索引友好,并避免在B树中随机插入,从而减少了插入时间。

11.可靠性

MySQL 8.0提高了MySQL的整体可靠性,因为:
MySQL 8.0将其元数据存储到经过验证的事务存储引擎InnoDB中。系统表(例如,用户和特权)以及数据字典表现在位于InnoDB中。
MySQL 8.0消除了一种潜在的不一致性来源。在5.7和更早版本中,实际上有两个数据字典,一个用于服务器层,一个用于InnoDB层,在某些崩溃的情况下,它们可能会不同步。在8.0中,只有一个数据字典。
MySQL 8.0确保原子,崩溃安全的DDL。这样,可以确保用户可以完全执行或完全不执行任何DDL语句。这在复制环境中尤其重要,否则,在某些情况下,主服务器和从服务器(节点)将不同步,从而导致数据漂移。

12.undo表空间

MySQL 8.0使用户可以完全控制Undo表空间,即,有多少个表空间,它们在哪里放置以及每个表中有多少个回滚段。
不再在系统表空间中撤消日志。在升级过程中,撤消日志将从系统表空间迁移到撤消表空间。这为使用系统表空间存储撤消日志的现有5.7安装提供了升级路径。
撤消表空间可以与系统表空间分开管理。例如,可以将撤消表空间放在快速存储中。
回收异常大的事务(在线)所占用的空间。至少创建两个撤消表空间,以允许表空间被截断。这使InnoDB可以缩小撤消表空间,因为一个撤消表空间可以处于活动状态,而另一个撤消表空间可以被截断。
回滚段越多,征用就越少。用户可能选择具有多达127个撤消表空间,每个表空间具有多达128个回滚段。更多的回滚段意味着并发事务更可能将单独的回滚段用于其撤消日志,从而减少了对相同资源的征用。

13.加密插件

MySQL 8.0将默认的身份验证插件从mysql_native_password更改为caching_sha2_password。相应地,libmysqlclient也将使用caching_sha2_password作为默认身份验证机制。新的caching_sha2_password结合了更好的安全性(SHA2算法)和高性能(缓存)。

14.SQL角色

MySQL 8.0实现了SQL角色。角色是特权的命名集合。目的是简化用户访问权限管理。可以向用户授予角色,向角色授予特权,创建角色,删除角色以及确定在会话期间适用的角色。

以上介绍MySQL 8.0带有新功能和性能改进,详情点击:
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-11.html

https://blogs.oracle.com/mysql/announcing-general-availability-of-mysql-80

https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

更多精彩内容,欢迎关注微信公众号

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45320660/article/details/115166830