MYSQL 5.7 & 8.0 默认编码
- MYSQL 8.0 的默认编码:utf8mb4
- 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