MySQL8.0新特性
官方文档:https://blogs.oracle.com/mysql/post/announcing-general-availability-of-mysql-80
https://www.cnblogs.com/xyabk/p/10882913.html
https://www.imooc.com/video/18904
一、用户与安全策略
1.1认证加密插件
show variables like 'default_authentication_plugin%';
在老版本的基础上,新增caching_sha2_password插件,可以使用缓存解决连接时的延时问题。
注意问题:客户端和服务端使用的加密插件必须要统一。
在MySQL8.0中,同时支持新老插件,如果C/S两端使用的插件不一致,则无法登录。
https://www.cnblogs.com/yinzhengjie/p/10301516.html
1.2密码管理策略
password_history |
不允许与最近几次使用过的密码重复,默认是0,即不限制;<br>若为5,则不能与近5次的密码相同。【基于次数限制】 |
password_require_current |
修改密码是否需要提供当前的登录密码,[OFF/ON] |
password_reuse_interval |
修改密码不允许与最近多少天的使用过的密码重复。<br>默认是0,即不限制。【基于天数限制】 |
1.3 双密码
相比于一个用户只有一个密码最大优点就是:修改密码不会导致应用不可用,那么应用就可以自 动使用副密码(副密码和当前主密码保持一致)连接数据库。确保业务的不中断。
1.4 角色
同Oracle角色。
1)创建一个角色 >create role '角色1'; 2)为这个角色赋予相应权限 >grant insert,update on *.* to '角色1'; 3)创建一个用户 >create user '用户1' identified by '用户1的密码'; 4)为这个用户赋予角色的权限 >grant '角色1' on *.* to '用户1'; 执行完上面4步,用户1就拥有了插入与更新的权限 5)再创建1个用户 >create user '用户2' identified by '用户2的密码'; 6)为这个用户赋予同样的角色 >grant '角色1' on *.* to '用户2' 执行完上面2步,用户2也用了角色1的权限,即插入与更新 查看用户权限,执行以下命令: >show grants for '用户名'; 7)启用角色,设置了角色,如果不启用,用户登录的时候,依旧没有该角色的权限 >set default role '角色名' to '用户名'; 8)如果一个用户有多个角色,使用以下命令 >set default role all to '用户名'; MySQL中与用户角色相关的表:mysql.default_roles、mysql.role_edges 9)撤销权限 >revoke insert,update on *.* from '角色名';
二、存储引擎方面
2.1 自增列
MySQL8.0在自增列方面也有新特性,它会在每次值修改时,将值写入redo log,并在CKPT时写入存储引擎私有的系统表中。消除了以往重启实例后自增列不连续的问题。
2.2 数据字典
https://www.cnblogs.com/DataArt/p/10240194.html
在MySQL中,数据字典信息内容就包括表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信息、存储过程、触发器等内容。
5.7中:ibdata1和frm中存放数据字典信息;
8.0中:取消了frm,以innodb表存储字典数据,位于msyql数据库下,对外不可见。
在之前版本中,数据字典信息不一定是存放于表中,所以在获取数据字典信息时候,不仅仅是查表操作。例如读取数据库表结构信息,底层其实是读取.frm文件来获得,是一个文件打开读取的操作。而在新版本中,数据字典信息都可以通过直接查表的方式获取,替代那些获取信息慢的方式。
2.3 DDL原子性
https://www.yht7.com/news/138049
MySQL5.7执行drop命令 drop table t1,t2
; 如果t1存在,t2不存在,会提示t2表不存在,但是t1表仍然会被删除。
MySQL8.0执行同样的drop命令,会提示t2表不存在,而且t1表不会被删除,保证了原子性。
2.4 undo空间自动回收
在8.0.2版本默认值由OFF变为ON,默认开启undo日志表空间自动回收。
innodb_undo_tablespaces参数在8.0.2版本默认为2,当一个undo表空间被回收时,还有另外一个提供正常服务。
innodb_max_undo_log_size参数定义了undo表空间回收的最大值,当undo表空间超过这个值,该表空间被标记为可回收。
2.5 redo、undo加密
三、SQL方面
3.1 窗口函数
https://www.cnblogs.com/DataArt/p/9961676.html
3.2 隐藏索引
https://blog.csdn.net/horses/article/details/85038949
官方定义:在 MySQL 8.0 中,索引可以被“隐藏”和“显示”。当对索引进行隐藏时,它不会被查询优化器所使用。我们可以使用这个特性用于性能调试,例如我们先隐藏一个索引,然后观察其对数据库的影响。如果数据库性能有所下降,说明这个索引是有用的,然后将其“恢复显示”即可;如果数据库性能看不出变化,说明这个索引是多余的,可以考虑删掉。
主键不能设置为隐藏(包括显式设置或隐式设置)。
使用方法:
1. 创建隐式索引 CREATE INDEX idx_name ON stu (sname) INVISIBLE; ALTER TABLE stu ADD INDEX idx_age(sage) INVISIBLE; 2. 查看某表的索引显式或隐式情况 SELECT INDEX_NAME, IS_VISIBLE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'school' AND TABLE_NAME = 'stu'; +------------+------------+ | INDEX_NAME | IS_VISIBLE | +------------+------------+ | idx_name | NO | | idx_age | NO | | idx_teacher| YES | +------------+------------+
四、其他
4.1 参数修改持久化
MySQL 8.0版本支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启MySQL时,可以从该配置文件获取到最新的配置参数。
系统会在数据目录下生成一个包含json格式的mysqld-auto.cnf 的文件,格式化后如下所示,当my.cnf 和**mysqld-auto.cnf **同时存在时,后者具有更高优先级。
4.2 字符集
从 MySQL 8 开始,使用 utf8mb4 作为 MySQL 的默认字符集。
4.3 JSON
MySQL 8 大幅改进了对 JSON 的支持,添加了基于路径查询参数从 JSON 字段中抽取数据的 JSON_EXTRACT() 函数,以及用于将数据分别组合到 JSON 数组和对象中的JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函数。