16年IMG大会就知道了下一版是8.x

新特性值得抄几篇文章记一下

隐藏索引

索引隐藏时,不会被查询优化器使用,方便观察了性能后决定索引是否可删

alter table t alter index i invisible;
alter table t alter index i visible;

索引被隐藏时,仍和正常索引一样实时更新,专为优化调试用

长期隐藏还不如干脆删掉

设置持久化

set global了, 下次启动又从配置读取

8.0

set persist max_connections = 500;

保存到数据目录 mysqld-auto.cnf

默认utf8mb4

通用表表达式(Common Table Expressions)

复杂查询会用嵌入式表

select t1.*, t2.* from 
  (select col1 from table1) t1,
  (select col2 from table2) t2;

cte

with
  t1 as (select col1 from table1),
  t2 as (select col2 from table2)
select t1.*, t2.* 
from t1, t2;

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

窗口函数

之前缺少 rank() 函数,需要实现排名时,必须手写 @ 变量

可用来实现若干新的查询方式

窗口函数有点像 SUM()、COUNT() 那样的集合函数,但不将多行查询结果合并为一行,而是将结果放回多行当中。即窗口函数不需要 GROUP BY

“班级学生人数” 表

 select * from classes;
+--------+-----------+
| name   | stu_count |
+--------+-----------+
| class1 |        41 |
| class2 |        43 |
| class3 |        57 |
| class4 |        57 |
| class5 |        37 |
+--------+-----------+

对人数从小到大进行排名

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 |
+--------+-----------+------+

创建名为 w 的 window,对 stu_count 排序,然后在 select 中对 w 执行 rank() 方法,将结果输出为 rank 字段

window 的创建是可选的

要在每一行中加入学生总数

select *, sum(stu_count) over() as total_count
    -> from classes;
+--------+-----------+-------------+
| name   | stu_count | total_count |
+--------+-----------+-------------+
| class1 |        41 |         235 |
| class2 |        43 |         235 |
| class3 |        57 |         235 |
| class4 |        57 |         235 |
| class5 |        37 |         235 |
+--------+-----------+-------------+

这样就可以一次性将每个班级的学生人数占比查出来

select *,
     (stu_count)/(sum(stu_count) over()) as rate
     from classes;
+--------+-----------+--------+
| name   | stu_count | rate   |
+--------+-----------+--------+
| class1 |        41 | 0.1745 |
| class2 |        43 | 0.1830 |
| class3 |        57 | 0.2426 |
| class4 |        57 | 0.2426 |
| class5 |        37 | 0.1574 |
+--------+-----------+--------+

以前要写一大段晦涩难懂的语句才能做到

事务性数据字典

完全脱离 MyISAM

避免Server层和引擎层各自管理表的元数据,crash-safe 提升,解决DDL的原子性问题

默认参数

  1. back_log和 max_connections一致,增强突发流量连接处理容量
  2. event_scheduler 默认为ON
  3. max_allowed_packet从4M加到64M,推荐512M
  4. bin_log,log_slaves_update默认on
  5. binlog过期时间30天,老版本7天

innodb 锁

FOR UPDATE NOWAIT和FOR UPDATE SKIP LOCKED

json

binlog 只记json更改的字段

other

降序索引、nosql、ddl 原子性