编码
从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集
JSON
MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数, 以及用于将数据分别组合到 JSON 数组和对象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。
窗口函数
窗口函数有点像是 SUM()、COUNT() 那样的集合函数,但它并不会将多行查询结果合并为一行,而是将结果放回多行当中。也就是说,窗口函数是不需要 GROUP BY 的。
假设我们有一张 “班级学生人数” 表:
mysql> select * from classes; +——–+———–+ | name | stu_count | +——–+———–+ | class1 | 41 | | class2 | 43 | | class3 | 57 | | class4 | 57 | | class5 | 37 | +——–+———–+ 5 rows in set (0.00 sec) 如果我要对班级人数从小到大进行排名,可以这样利用窗口函数:
mysql> select *, rank() over w as rank
from classes
-> window w as (order by stu_count);
+——–+———–+——+
| name | stu_count | rank |
+——–+———–+——+
| class5 | 37 | 1 |
| class1 | 41 | 2 |
| class2 | 43 | 3 |
| class3 | 57 | 4 |
| class4 | 57 | 4 |
+——–+———–+——+
5 rows in set (0.00 sec)
在这里我们创建了名为 w 的 window,规定它对 stu_count 字段进行排序,
然后在 select 子句中对 w 执行 rank() 方法,将结果输出为 rank 字段。
隐藏索引
隐藏索引的特性对于性能调试非常有用。在 8.0 中,索引可以被“隐藏”和“显示”。 当一个索引隐藏时,它不会被查询优化器所使用。
也就是说,我们可以隐藏一个索引,然后观察对数据库的影响。 如果数据库性能有所下降,就说明这个索引是有用的,于是将其“恢复显示”即可; 如果数据库性能看不出变化,说明这个索引是多余的,可以删掉了。
隐藏一个索引的语法是:
ALTER TABLE t ALTER INDEX i INVISIBLE;
恢复显示该索引的语法是:
ALTER TABLE t ALTER INDEX i VISIBLE;
当一个索引被隐藏时,我们可以从 show index 命令的输出中看到,该索引的 Visible 属性值为 NO。
注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的, 这个特性本身是专门为优化调试使用。如果你长期隐藏一个索引,那还不如干脆删掉, 因为毕竟索引的存在会影响插入、更新和删除的性能。