MYSQL 8.0新特性

126 阅读2分钟

MYSQL 5.7 & 8.0 默认编码

  1. MYSQL 8.0 的默认编码:utf8mb4
  2. MYSQL 5.7 的默认编码:latin1

MYSQL 5.7 & 8.0 自增主键的区别

  在MYSQL 8.0以前,自增主键AUTO_INCREMENT的值如果大于 max(primary key) + 1,在MYSQL重启之后,会重置AUTO_INCREMENT=max(primary key) + 1;

  MYSQL 8.0将自增主键持久化到重做日志中,每次计数器发生变化,都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。

加密函数MD5(str)

SELECT MD5('hello world');

加密函数SHA(str)

SELECT SHA('hello world');

加密函数SHA2(str, hash_lenght)

使用hash_lenght作为长度,加密str。hash_lenght的长度支持224,256,384,512,0,其中0等同于256;

SELECT SHA2('tom123456', 0)

窗口函数

窗口函数类似于SUM() COUNT() 这些集合函数,但它并不会把多行查询结果合并为一行,而是将结果放回到多行当中。也就是说,窗口函数是不需要GROUP BY的。

GROUP BY不再隐式排序

从MYSQL 8.0开始,GROUP BY字段不再隐式排序,需要排序必须加上ORDER BY子句。

通用表表达式

CTE(Common Table Expressions):通用表表达式。
CTE是一个可以重复使用的结果集;相比于子查询,CTE的效率会更高,因为非递归的CTE只会查询一次并可以重复使用。

子查询方式:

SELECT g.* (SELECT name FROM goods WHERE id = g.id) as pname
FROM goods;

CTE的方式:

WITH cte AS (SELECT * FROM goods)
SELECT g.*, (SELECT cte.name FROM cte WHERE cte.id = g.id) AS gname
FROM goods AS g;

CTE可以引用其他CTE的结果,示例如下:

WITH cte1 AS (SELECT * FROM goods), cte2 AS (select g.*, cte1.name as gname FROM goods AS g LEFT JOIN cte1 ON g.gid = cte1.id)
SELECT * FROM cte2;

特殊的CTE - 递归CTE

  • seed查询:seed查询会被执行一次,以创建初始数据子集;
  • recursive查询:recursive查询会重复执行以返回数据子集

由union [all] 或 union distinct 分隔;

子查询引用自身,WITH子句必须以WITH RECURSIVE开头。

DDL的原子化

InnoDB的DDL支持事物完整性,即DDL操作要么成功要么回滚。

DDL操作回滚日志写入到 data dictionary 数据字典表 mysql.innodb_ddl_log,该表是隐藏的表,通过show tables无法看到。

支持降序索引

在组合索引中,b的排序方式是降序的。降序索引在8.0才被支持。

CREATE TABLE idxt1
(
  a INT,
	b INT,
	c INT,
	INDEX idx1(a, b desc)
)

通过SHOW CREATE TABLE table_name查看创建的表中,索引中b的排序方式是降序的。

CREATE TABLE `idxt1` (
  `a` int DEFAULT NULL,
  `b` int DEFAULT NULL,
  `c` int DEFAULT NULL,
  KEY `idx1` (`a`,`b` DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci