MySQL 8.0 发布了。
据官方称,此次发布意味着MySQL从此兼顾NoSQL和SQL于一身。NoSQL SQL=MySQL。
8.0发布了很多新的功能,包括SQL方面、JSON方面以及DevOps方面等等。
不过今天主要介绍的是SQL方面有哪些更新。接下来为你列出针对SQL发布的主要新功能。
目录:
- NOWAIT 和 SKIP LOCKED
- 降序索引(Descending Indexes)
- Grouping
- 默认的CHARSET变为utf8mb4
NOWAIT 和 SKIP LOCKED
MySQL 8.0 新增了NOWAIT和SKIP LOCKED 。在这之前,当一行数据被锁定时(比如是UPDATE或者通过SELECT ... FOR UPDATE),其他的事务将不得不等待,直到锁被释放。
而现实中,在有些情况下,我们可能希望如果某行被锁定了,那么要么立刻返回要么忽略锁定的行,而不是一直等待。
确实有这样的需求。
现在我们就可以使用NOWAIT来实现这个需求,使用了NOWAIT之后,将永远不去等待行锁。而是查询立即返回一个错误而告终。
如果是使用SKIP LOCKED的话,那么也不会去等待行锁释放。而是直接忽略掉被锁住的那一行,根本就不会去读那一行。
降序索引(Descending Indexes)
8.0现在支持降序索引了。现在存储在索引里的值可以按照降序的方式来分布了。然后我们扫描时,从头开始扫描。
在8.0之前,要想建立一个降序索引,就只能先创建一个升序索引(ascending index),然后从尾部开始倒着扫描。
因为从前往后读要比从尾到头读更快,所以这样的新支持(降序索引)改善了查询的性能。
8.0新增的降序索引的另外一个好处就是当使用ORDER BY语句进行ASC或DESC排序的时候就可以直接使用索引来排序,而不像过去那样通过filesort来排序。
GROUPING
MySQL 8.0提供了GROUPING(), GROUPING()函数将“超级聚合行”与普通分组行进行区分。 GROUP BY扩展SQL(如ROLLUP)会生成超级聚合行,其中所有值的集合均由null表示。 使用GROUPING()函数,你可以区分表示超级聚合行中所有值的集合的null与常规行中的NULL。 有点绕,上手操作一下就知道了。
默认的CHARSET变为utf8mb4
另外从MySQL 8.0开始,默认的CHARSET已变为utf8mb4,这是一个支持更多字符的字符集,比如emoji表情等,?。