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,就要考虑分库分表的问题。
方式
- 垂直分表: 从业务角度将表进行分库分表,没有从根本上解决效率问题。
- 水平分表:从数据角度将表进行分库分表,解决了性能效率的根本问题。
分库分表策略
- 取模: 数据分布均匀,不易扩展
- …