mysql8新特性
宋标 Lv5

Mysql

8版本新特性

1. 降序索引

索引创建默认升序,8版本可以指定降序索引。

2. group by默认不排序

8版本前默认升序,8版本需要order by指定。

3. 支持函数索引

创建索引时可以调用函数。

4. 自增变量持久化

在8.O之前的版本,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下
会导致业务主键冲突或者其他难以发现的问题。自增主键重启重置的问题很早就被发现(https:bugs.mysql..com/bug.php?id=199),一直到8.0才被解决,8.0版本将会对
AUTO INCREMENT值进行持久化,MySQL重启后,该值将不会改变。

5. 跳过锁等待

对于select.for share(8.O新增加查询共享锁的语法)或select..for update,在语句后面添加NOWAIT、SKIP LOCKED语法可以跳过锁等待,或者跳过锁定。
在5.7及之前的版本,select..for update,如果获取不到锁,会一直等待,直到innodb lock wait timeouti超时。
在8.O版本,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁
定的行。
应用场景比如查询余票记录,如果某些记录已经被锁定,用skip locked可以跳过被锁定的记录,只返回没有锁定的记录,提高系统性能。

6. innodb_dedicated_server自适应参数

默认关闭,如果开启,innodb则能够根据系统资源自适应服务器内存资源,会尽可能的多占用系统资源来提高mysql的性能。

7. innodb_deadlock_detect参数

默认开启,8版本新增死锁检测参数。

8. undo文件不再使用系统表空间

默认创建两个UNDO表空间,不再使用系统表空间。

9. binlog日志过期时间精确到秒

在8.0版本之前,binlog日志过期时间设置都是设置expire logs days参数,而在8.0版本中,MySQL默认使用binlog_expire_logs_seconds参数。

10. DDL原子性

数据定义语言(例如建表,删表等操作)支持原子性,8版本前不支持。

11. 参数修改持久化

MySQL8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cf)中,重启MySQL时,可以从该配置文件
获取到最新的配置参数。set global设置的变量参数在mysql重启后会失效。

12. 默认字符集

8版本utf8默认指向utf8mb4。

13. 默认存储引擎

系统表默认存储引擎时innodb。

14. 窗口函数

在聚会函数后加入over() 函数,对比于group by,group by是将整个结果集分组,分组的列不会出现重复,再去算出聚合函数的值。窗口函数会出现重复的列名。

索引

b树和b+树的区别

  • b+树的数据存储的叶子节点,存在数据冗余
  • b+树的叶子节点是一个链表结构

    索引结构

    InnoDB引擎:索引即数据,数据即索引
    用户记录中都会进行从小到大排序,目录记录中存储该用户记录页最小记录的值+页号
    所有用户记录存放在叶子节点,物理地址并不连续,数据页而是靠双向链表 (忘了可以去看页的page Hander)来查找上一页和下一页(在文件读写时会有随机IO的性能问题)
    索引结构

    注意事项

    索引注意事项

    分库分表

    简述

    阿里开发手册:当数据量打到500w或者数据文件达到2g,就要考虑分库分表的问题。

    方式

  • 垂直分表: 从业务角度将表进行分库分表,没有从根本上解决效率问题。
  • 水平分表:从数据角度将表进行分库分表,解决了性能效率的根本问题。

    分库分表策略

    • 取模: 数据分布均匀,不易扩展
 评论