mysql8创建⽤户并授权_MySQL8.0新特性
在这之前Mysql的版本是5.7,也是⽬前使⽤最⼴泛的⼀个版本。现在新版本跳过了6和7直接来到了8,那么V6和V7版本去哪⾥了呢?⽐较靠谱的说法是v6⽤作了内部的其他⽤途⽽v7的话是因为mysql有个产品叫做clusterdb他有7这个版本,所以这个新版本有⼀个⽐较⼤的跳跃。
不过这些对我们来说都不重要我们作为使⽤者只关注这个版本给我们提供了哪些⽐较强⼤和实⽤的新功能。
下⾯我们来介绍⼀下mysql8.0给我们提供了哪些功能
账户与安全
新版本加对密码管理和账户安全加⼊了⼀些新的特性,以及新增了⾓⾊功能
⽤户创建和授权
mysql8.0中创建⽤户和⽤户授权的命令必须分开执⾏⾸先需要通过 create user 'colipu'@'%' identified by 'colipu@2020'; 来创建⽤户, 然后再通过grant all privileges . to 'colipu'@'%'; 来对⽤户进⾏授权。
我感觉这样做唯⼀的好处就是使语句的语义更加清晰了⼀点。⼤家可以⾃⾏尝试⼀下。
认证插件的更新
在8.0中默认的⾝份认证插件是 caching_sha2_password,替代了之前的mysql_native_password 我们可以通过 show variables like
'default_authentication%'; 或者是user表看到这个变化。
那么新的认证插件肯定是更加安全性能也会更好些。我们需要注意的是如果我们使⽤的服务端是8.0版本⽽我们的客户端没有及时更新的话,那么在连接认证的时候可能会出现⼀些错误,我们该如何解决呢?接下来划重点。
第⼀种解决⽅式是我们修改系统的配置⽂件,让它继续使⽤之前的认证⽅式,如下图:
我们只需要到mysql的配置⽂件然后设置认证⽅式为 mysql_native_password,然后重启服务即可
密码管理
mysql8开始允许限制重复使⽤以前的密码了,通过以下参数来配置:之前下过mysql现在重新下载mysql
password_history=3 这个参数意味着我们的新密码不能与最近三次的密码相同
password_reuse_interval=90 这个是按照⽇期来指定的限制,意味着我们的新密码不能与最近90天的密码相同
password_requeire_current=ON 这个参数默认值是OFF 如果我们设置为ON的话就意味着我们在修改密码的时候需要提供当前登陆账户的密码。
⾓⾊管理
mysql8新引⼊⾓⾊的功能,⾓⾊的本质就是⼀组权限的集合。在之前的版本中我们要给⽤户授予多个权限我们只能⼀个⼀个的去操作,如果⽤户⽐较多并且权限也⽐较多的话那估计殷啸奕能累趴,新的
版本在⽤户与权限之间加了⼀层⾓⾊功能。这样的话只需要把权限授权给⾓⾊就可以了极⼤的简化了DBA的⼯作量。
优化器索引
新增了三种索引⽅式,降序索引 隐藏索引 以及函数索引
隐藏索引
隐藏索引也称为不可见索引,隐藏索引不会被优化器使⽤,但是我们在操作数据的时候仍然会被维护,既然这样我们为什么还需要隐藏索引?其实主要是有个典型的应⽤场景,⼀个是软删除 另⼀个是灰度发布。
什么是软删除,通常来说之前的版本我们想删除某些不需要的索引,殷啸奕会直接把这个索引删除但是他到楼下抽烟的时候突然想到这个索引不能删,这个时候他只能再重新创建索引,如果数据库的数据量⽐较⼤的话这种操作的成本是⾮常⾼的,现在8.0新增了这个软删除功能,就是在你要删除索引的时候可以先把这个索引给隐藏掉这样查询优化器就不会使⽤了但是还是需要维护它的,等你彻底确认这个索引不需要了然后就可以做物理删除了。
灰度发布是什么呢?例如,我们想要测试⼀些索引的功能随后可能会使⽤到这些索引我们可以先在线
上做⼀些测试这时候我们就可以先增加⼀些这种隐藏索引对我们线上的查询不会受到影响但是后台还是会维护它,然后我们确认后这些索引有效某些查询是可以⽤到这个索引的,然后我们就可以把它设置成可见索引。这样就实现了我们灰度发布的效果。
关于隐藏索引的使⽤⽅式⼤家可以⾃⾏百度使⽤。
降序索引
mysql8.0开始真正的⽀持降序索引了,我们知道在之前的版本中也是⽀持降序索引的定义,但是实际上在我们查询的时候服务器会忽略我们的这个定义,创建的还是升序索引。
⽬前只有InnoDB存储引擎⽀持降序索引,只⽀持 BTREE 降序索引。
由于降序索引的引⼊MySQL8.0不再对GROUP BY 操作进⾏隐式排序,如果想要对数据的排序还是需要⼤家写 ORDER BY ⼦句的
函数索引
MySQL从8.0.13开始⽀持在索引中使⽤函数的值,我们知道索引⼀般都是使⽤的列值,那么新的索引可以使⽤函数(表达式)的值来进⾏索引,同样这个索引⽀持降序索引以及JSON数据的索引。
对于函数索引来说它的本质就是基于虚拟列或者叫虚拟计算列功能来实现的
通⽤表表达式
CTE(通⽤表表达式)是⼀个命名的临时结果集,仅在单个SQL执⾏范围内存在类似于派⽣类。
我们知道通⽤表表达式在sql2003的标准中就已经引⼊了⽽且主流的数据库都有这个功能,mysql8也是终于追赶了这⼀步加⼊了强⼤的sql 功能
⾮递归CTE
我们先来了解⼀下简单的⾮递归查询。
1.派⽣表:select * from (select 1) as dt;
2.通⽤表表达式:with cte as(select 1) select * from cet;
以上2条sql执⾏结果⼀致,我们从第⼆个sql可以看出cte⾸先定义了⼀个 with然后后⾯跟了⼀个表达式的名称(或者叫做表的名称) as 后⾯是它的定义,定义完成后我们就可以使⽤这个表达式了。其实简单的可以理解为这个cet(通⽤表表达式)就是⼀个变量只是变量表⽰的是⼀张表。我们可以在使⽤查询语句或者是其他的语句中使⽤这么⼀个变量。
接着我们来看在sql语句中的操作⽰例:
如上图使⽤了2张cet表这说明了,cte定义的表是可以在后⾯继续使⽤的,就像我们写代码的时候定义了⼀个变量后⾯可以使⽤这个变量(可以重复使⽤我们之前定义好的内容)这个也是mysql增加了⼀个类似可以编程功能的扩展吧!
递归CTE
通⽤表表达式的第⼆种叫做递归cte,递归cte是指我们在使⽤中对⾃⼰引⽤的cet,这个跟我们编程语⾔中的递归概念是⼀样的。下⾯我们来看⼀下⼀个简单的⽰例:
⾸先出现了⼀个关键字 RECURSIVE 它的意思是表⽰这是⼀个递归形式的cte表达式,后⾯的‘cte’ 表⽰这个表的名称as 后⾯是它的定义,我们看到这个定义中是有2个查询语句并且使⽤UNION ALL 来组成的,select 1 表⽰我们的初始化语句就是第⼀次运⾏的话产⽣⼀个1这个值,下⾯的查询 selcet n+1 from cet 从这句sql中也体现了递归的调⽤概念,where条件是为了让我们在完成递归后到达这个条件就停⽌执⾏,不然会⼀直循环的!
递归的特性⼀般适⽤于我们查询有上下级关系的数据例如我们公司的组织架构。
递归的限制
我们在使⽤递归的时候⼀般会定义⼀个终⽌条件,就像我们上⾯那个sql中的where条件,如果忘记定义的话会执⾏⼀个死循环的操作,所以MySql8.0中给我们提供了⼀些参数:
cte_max_recursion_depath: 最⼤递归的深度(调⽤的次数)
max_execution_time: 最⼤执⾏时间
我们从上图可以看到,如果我们没有定义where条件(递归终⽌条件)在执⾏⼀定次数后系统会给我们提⽰。
我们从系统中可以看到,这个系统中默认的参数是1000次,所以上⾯的例⼦中在执⾏到了1001次就报错了
我们简单总结⼀下,CTE与我们之前使⽤的派⽣表⾮常类似只要是之前使⽤的派⽣表现在基本上都可以使⽤CTE来替代,CTE的语义也更加清晰让我们读起来更流畅。
我们也可以把它当做视图或者临时表来理解这样更便于我们记忆但是有⼀点需要知道,他们仅仅是功能类似⽽已。视图是需要维护的⽽CTE 是不需要我们维护的,他是sql语句级别的定义。
CTE可以在我们查询中多次引⽤,就像我们编程时候的变量⼀样。
它最⼤的特点就是⽀持递归调⽤。
最后给⼤家写⼀个波那契数列:
窗⼝函数
窗⼝函数也称之为分析函数主要是为了给sql语句提供⼀个强⼤的数据分析功能,有了这个之后mysql也可以通过sql语句做⼀些⽐较强的数据的分析了
与窗⼝函数⽐较类似的是分组聚合函数。分组聚合⼤家都⽐较了解,它主要是针对数据先进⾏ groupby 然后在根据每个组内聚合成⼀个结果,⽐如说组内的平均数和总和之类的。
窗⼝函数也可以做分组,不同的是针对分组内的每⼀⾏都会⽣成相应的结果。
基础概念
下⾯⽰例演⽰基础的概念,⾸先我这⾥创建了⼀个数据库表数据如下图:
我们使⽤常规的函数来计算相同的sku共卖了多少钱。select sku,sum(price*number) from orders group by sku;
select sku,price,number,sum(price*number) over (partition by sku) from orders order by sku,price,numice,number;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论