前言:mysql8.0是非常大的一个版本,在这里我只是抛砖引玉的带大家一起看一看,感兴趣的同学可以自己进行深入的学习,所以我只讲一些对我们工作中可能有帮助的功能,还有一些“有趣”的功能。
MySQL 5.7 到 8.0,Oracle 官方跳跃了两个大的版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL,全新的版本升级策略,安全和账号管理加强,InnoDB 功能增强等。
MySQL 8.0 具体版本更新内容简单列举:
1. 数据字典
MySQL 8.0 摒弃了 Server Layer 定义的 FRM 文件和其它非事务表,使用了一组 InnoDB 表来 保存数据字典,支持事务特性。
2. Atomic DDL
在数据字典支持事务特性的基础上,8.0 增加了一个 DDL log 字典表,用来协调在DDL 过程中,对数据字典,文件系统 和 事务系统的修改,做到原子性。
3. Auto increment 持久化
在 InnoDB 引擎中,新增了一个引擎私有的系统表 innodb_dynamic_metadata,自增值就保存 在这个表里,在对每张表进行修改 auto increment 值的时候,都使用 redo log 进行保护,在做
checkpoint的时候,持久化到这个系统表中,保证下次重启后,auto increment 能够从持久化中恢复出来,并且不受事务上下文回滚而影响。
4. 优化器和对象相关
1) 支持 invisible index,方便用户和DBA调试。
2)descending indexes,提升降序扫描的效率。
3)Common table expressions,支持 with 语法完成。
4)Window functions,增加大量窗口函数
5)Regular expression,重新设计了正则表达式的支持。
5. Json加强
在Json上,8.0 增加了更多的功能性。
6. 安全和账号管理
账号方面,从 8.0 开始,支持 role 对权限进行便捷管理,以及新增多个系统权限,分别对应新 增了 ROLE_EDGES,GLOBAL_GRANTS 两个系统表;mysql schema 下的涉及权限和用户相关的表 更改成 InnoDB 引擎,支持事务特性,保证了账号管理语句的原子性。
认证方面,caching_sha2_password 作为默认的认证 plugin,以提升安全,但要注意并不能和 8.0 之前的client进行兼容。
链路加密,如果编译了OpenSSL 1.1.1 及以上,MySQL 8.0 SSL 将支持到 TLSv1.3 版本。
系统账号,在 8.0.16 新增 SYSTEM_USER 权限,用于区分 系统账号还是普通账户,可以对用户 进行分类管理。
7. Lock
SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 新增了 NOWAIT 和SKIP LOCKED 语法,减少长时间和非必要的阻塞。
8. 死锁检测
在高并发的情况下,InnoDB 引擎中对于事务锁的死锁检测,将是影响性能的重要因素,
8.0 后提供了一个参数innodb_deadlock_detect:https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_deadlock_detect,用来打开或者关闭引擎的死锁检测,在业 务能够明确相关风险的情况下,关闭死锁检测,能大幅提升并发能力。
9. 临时表
在InnoDB引擎中,用户创建的临时表将统一到 ibtmp 文件的临时表空间中; 对于系统运行过程中产生内存临时表,8.0后启用了新的TempTable引擎,支持 blob 字段,功能上优于 memory ngine。
10. Instant add column
InnoDB 解决了长期困扰 DBA 的加字段要 copy 整张表数据的问题。现在可以快速的增加字段,只修改数据字典,而不用修改表中的记录本身。
11. Redo优化
Redo的写入一直是 InnoDB 高并发情况下的瓶颈,8.0 开始:
用户线程可以并发的copy redo 日志到 log buffer中
用户线程可以以更松散的方式把 dirty block 加入到脏块链表中
独立的写线程完成 redo 的持久化
12. Partial update on lob
InnoDB 继续优化 partial update on lob data,对于仅仅修改很少字节的 lob 字段,能够大幅 减少 undo data,并提升效率。