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

 

为什么用utf8mb4

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了,

既然utf8能兼容绝大部分的字符,为什么要扩展utf8mb4?

随着互联网的发展,产生了许多新类型的字符,也就是我们通常在聊天时发的小黄脸表情(四个字节存储),所以,设计数据库时如果想要允许用户使用特殊符号,最好使用utf8mb4编码来存储,使得数据库有更好的兼容性,但是这样设计会导致耗费更多的存储空间。

二 .隐藏索引

隐藏索引的特性对于性能调试非常有用,在8.0 中,索引可以被隐藏和显示,当一个索引隐藏时,他不会被查询优化器所使用,也就是说可以隐藏一个索引,然后观察对数据库的影响.如果性能下降,就说明这个索引是有效的,于是将其”恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多于的,可以删掉了.

查看一个表索引

SHOW INDEX FROM user

隐藏一个索引的语法

ALTER TABLE user ALTER INDEX idx_name INVISIBLE;

恢复显示该索引的语法

ALTER TABLE user ALTER INDEX idx_name VISIBLE;

三.设置持久化

MySQL 的设置可以在运行时通过 SET GLOBAL 命令来更改,但是这种更改只会临时生效,到下次启动时数据库又会从配置文件中读取。
MySQL 8 新增了 set persist 命令,例如:
set persist max_connections = 500;
MySQL 会将该命令的配置保存到数据目录下的 mysqld-auto.cnf 文件中,下次启动时会读取该文件,用其中的配置来覆盖缺省的配置文件。

四.通用表达式

MySQL 8.0 带来了支持递归的通用表达式的功能。非递归的通用表达式由于允许由form子句派生的临时表的原因可以被多次引用,因而被解释为改进型的派生表(from子句中的临时表)。而递归的通用表达式则由一组原始住居,经过处理后得到新的一组数据,再被带入处理得到更多的新数据,循环往复直到再也无法产生更多新数据为止。通用表达式也是一个用户呼声频繁的SQL功能。

CTE(Common Table Expression)可以认为是派生表(derived table)的替代,在一定程度上,CTE简化了复杂的join查询和子查询,提高了SQL的可读性和执行性能。

CTE优势

  • 查询语句的可读性更好
  • 在一个查询中,可以被引用多次
  • 能够链接多个CTE
  • 能够创建递归查询
  • 能够提高SQL执行性能
  • 能够有效地替代视图

复杂的查询会使用嵌入式表,例如:

SELECT
    t1.name,t2.dept_name 
FROM
    ( SELECT id, name fromorg_user ) t1,
    ( SELECT dept_name, user_id from org_dept ) t2 
WHERE
    t1.id = t2.user_id

mysql8可以这样写:

	WITH
	t1 as (SELECT id, NAME FROM org_user ),
	t2 as ( SELECT dept_name, user_id FROM org_dept )
	select t1.name,t2.dept_name from t1,t2
	where t1.id = t2.user_id

这样看上去层次和区域都更加分明,改起来也更清晰的知道要改哪一部分。

五.EXPLAIN ANALYZE

Explain 是我们常用的查询分析工具,可以对查询语句的执行方式进行评估,给出很多有用的线索。但他仅仅是评估,不是实际的执行情况,比如结果中的 rows,可能和实际结果相差甚大。

Explain Analyze 是 MySQL 8 中提供的新工具,可贵之处在于可以给出实际执行情况。Explain Analyze 是一个查询性能分析工具,可以详细的显示出 查询语句执行过程中,都在哪儿花费了多少时间。Explain Analyze 会做出查询计划,并且会实际执行,以测量出查询计划中各个关键点的实际指标,例如耗时、条数,最后详细的打印出来。

这项新功能建立在常规的EXPLAIN基础之上,可以看作是MySQL 8.0之前添加的EXPLAIN FORMAT = TREE的扩展。EXPLAIN除了输出查询计划和估计成本之外,EXPLAIN ANALYZE还会输出执行计划中各个迭代器的实际成本。

6.窗口函数

从 MySQL 8.0 开始,新增了一个叫窗口函数的概念。

它可以用来实现若干新的查询方式。窗口函数与 SUM()、COUNT() 这种聚合函数类似,但它不会将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY。

在MySQL 5.7中字段名为rank是可以的,但是在8.0中因为有了窗口函数,字段名为rank就报错

函数的用法

mysql8窗口(看窗)函数的语法用法详解_mysql8 partition by_程序员先森的博客-CSDN博客

七.clone plugin

MySQL 8.0 新增了一个clone插件,能够实现本地或者远程MySQL实例快速克隆。克隆的数据是InnoDB引擎的快照数据,包括数据库(schema),表(tables),表空间(tablespaces),数据字典元数据(data dictionary metadata)。克隆的数据是一个功能齐全的数据目录,使用该目录能够快速添加从节点或者组复制节点。

从远程MySQL实例克隆数据时,远程的MySQL实例称之为donor,它是数据提供者,是克隆的数据源。本地克隆数据的接收者,称之为recipient。克隆的数据通过网络,从donor传输给recipient。recipient本地的数据默认会被清除,当然也可以为recipient指定一个不同的目录用于存储克隆数据。

克隆插件除了克隆数据之外,还支持搭建复制。克隆操作能够获取复制的坐标点,在克隆完成之后,利用复制的坐标点信息,能够很方便的搭建主从复制,或者增加组复制节点。克隆插件支持表数据加密和压缩,在使用clone插件之前,需要安装插件。