MySQL8.0新特性

MySQL从5.7一跃直接到8.0,本次的版本更新,在功能上主要有以下6点:
1,账户与安全
2,优化器索引
3,通用表表达式
4,窗口函数
5,InnoDB 增强
6,JSON 增强
一、账户与安全
1.用户的创建与授权在MySQL5.7的版本:> grant all privileges on *.* to '用户名'@'主机' identified by '密码';在MySQL8.0需要分开执行:>create user '用户名'@'主机' identified by '密码';>grant all privileges on *.* to '用户名'@'主机';用以前的一条命令在8.0里面创建用户,会出现sql语法错误2.认证插件更新MySQL5.7默认身份插件是mysql_native_passwordMySQL8.0默认的身份插件是caching_sha2_password查看身份认证插件命令:show variables like 'default_authentication_plugin%';身份认证插件可以通过以下2中方式改变:1)系统变量default_authentication_plugin去改变,在my.ini文件的[mysqld]下面设置default_authentication_plugin=mysql_native_password即可2)如果希望只是某一个用户通过mysql_native_password的方式认证,可以修改数据库mysql下面的user表的字段,执行以下命令:>alter user '用户名'@'主机' identified width mysql_native_password by '密码';3.密码管理MySQL8.0的密码管理策略有3个变量password_history 修改密码不允许与最近几次使用或的密码重复,默认是0,即不限制password_reuse_interval 修改密码不允许与最近多少天的使用过的密码重复,默认是0,即不限制password_require_current 修改密码是否需要提供当前的登录密码,默认是OFF,即不需要;如果需要,则设置成ON查询当前MySQL密码管理策略相关变量,使用以下命令:>show variables like 'password%';1)设置全局的密码管理策略,在my.ini配置文件中,设置以上3个变量的值这种设置方式,需要重启mysql服务器;某些生产环境不允许重启,MySQL8.0提供了关键字persist,持久化,执行以下命令:>set persist password_history=6;这条命令会在数据目录下生成新的配置文件(/var/lib/mysql/mysqld-auto.cnf),下次服务器重启的时候除了读取全局配置文件,还会读取这个配置文件,这条配置就会被读入从而达到持久化的目的2)针对某一个用户单独设置密码管理策略>alter user '用户名'@'主机' password history 5;这样,这个用户的password_history 就被设置成了5,查看一下:>show user,host,Password_reuse_history from user;查看某一张的字段的所有字段,使用以下命令:>desc 表名;4.角色管理角色:一组权限的集合一组权限赋予某个角色,再把某个角色赋予某个用户,那用户就拥有角色对应的权限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 '角色名';二、优化器索引
1.隐藏索引(invisible index)隐藏索引不会被优化器使用,但仍需要维护应用场景:1)软删除删除索引,在线上,如果删除错了索引,只能通过创建索引的方式将其添加回来,对于一些大的数据库而言,是比较耗性能的;为了避免删错,可以先将其设置为不可见,优化器这时候就不会使用它,但是后台仍然在维护,确定后,再删除 。2)灰度发布与软删除差不多,如果想要测试一些索引的功能或者随后可能会使用到这个索引,可以先将其设置为隐藏索引,对于现有的查询不会产生影响,测试后,确定需要该索引,可以将其设置成可见索引 。创建隐藏索引,执行如下命令(如果是不隐藏,则不需要后面的invisible关键字):>create index 索引名称 on 表名(字段名) invisible;查询某一张表的索引,执行如下命令:>show index from 表名;使用explain语句查看查询优化器对索引的使用情况>explain select * from 表名 where 条件;查询优化器有很多开关,有一个是use_invisible_indexes(是否使用隐藏索引),默认是off(不适用),将其设置成on,即可使用隐藏索引 。查看当前查询优化器的所有开关变脸,执行如下命令:>select @@optimizer_switch;设置已经存在的索引为可见或者隐藏,执行如下命令:>alter table 表名 alter index 索引名 visible;>alter table 表名 alter index 索引名 invisible;主键不可以设置为隐藏所以 。


推荐阅读