本地的网站建设网站开发推广招聘
本地的网站建设,网站开发推广招聘,建筑工程信息频道,江西合创建设工程有限公司 网站这里写目录标题前言mysql8.0的新特性1、账户安全2、优化器索引2.1、隐藏索引#xff08;invisible#xff09;2.2、降序索引2.3、函数索引3、SQL语句增强4、新增数据分析函数5、InnoDB增强5.1、优化了一些元数据文件5.2、将系统表mysql和数据字典表#xff0c;全部改为InnoD…
这里写目录标题前言mysql8.0的新特性1、账户安全2、优化器索引2.1、隐藏索引invisible2.2、降序索引2.3、函数索引3、SQL语句增强4、新增数据分析函数5、InnoDB增强5.1、优化了一些元数据文件5.2、将系统表mysql和数据字典表全部改为InnoDB引擎5.3、提高了对数据字典表的访问性能5.4、DDL操作可以是原子性的了5.5、自增列持久化5.6、自增列自动感知最大值5.7、死锁检查5.8、锁定语句新增选项只针对行锁5.9、支持部分快速DDL5.10、InnoDB临时表空间优化5.11、新增静态变量innodb_dedicated_server5.12、其他6、JSON相关6.1、新增内联路径操作符6.2、新增json函数前言
想必现在很多人还在用着mysql5.7或者更早的版本包括我现在所在公司也是用着5.7版本毕竟稳定。 其实mysql8.0.1在2016年就发版了但一直到2018年发版的8.0.11才算真正意义上的正式版。 从mysql5到mysql8其实中间还有mysql6过渡版本和mysql7集群版本但对于我们而言可以直接理解为mysql从5.7升级到mysql8.0.11现在官网最新的版本已经到了mysql8.0.18。 mysql下载官网
mysql8.0的新特性
1、账户安全
1.1、用户创建和用户授权分开执行了 5.7版本可以通过grant一个语句创建用户并授权 8.0版本不能使用grant语句创建用户并授权了需要先create语句创建用户再grant授权 这样做应该就是为了让语句更加清晰各司其职。 1.2、身份认证插件更新 通过语句查看身份认证插件show variables like ‘default_authentication%’ 5.7版本默认的身份认证插件是mysql_native_password 8.0版本默认的身份认证插件改成了caching_sha2_password 新版本的插件说是对插件进行了安全和性能方面的升级。 我们在用客户端连接新版本的mysql的时候如果没有升级客户端可能会报错连接认证失败。
当然新版本的认证插件也可以改回去可以在mysql的配置文件中改然后重启。 /etc/my.cnf中搜索mysql_native_password去调该行注释即可 也可以动态修改某个用户的身份认证插件 alter user ‘用户名’’%’ identified with mysql_native_password by ‘新密码’ 修改后可以通过下面语句查看单个用户的身份认证插件被修改了 select user,host,plugin from mysql.user;
1.3、密码管理策略加强了 新增限制功能不允许重复使用以前的密码具体变量含义如下 不能与前3次的密码重复password_history3; (默认0) 不能与30天内的密码重复password_reuse_interval30; (默认0) 修改密码时需要提供当前用户密码root用户不受这个参数限制password_require_currentON; (默认OFF) 查看变量show variables like ‘password%’;
1.3.1、修改这些变量可以直接修改mysql的配置文件直接在文件末尾追加password_history3就好了这样改是全局所有用户都修改而且需要重启服务
1.3.2、修改这些变量也可以动态修改变量set persist password_history3; set persist 也是mysql8.0的新功能设置的变量是持久化的重启也会生效。 这个就比之前版本的set global …这种重启丢失靠谱多了。 其实set persist 的原理就是在目录/var/lib/mysql下新生成了一个文件mysqld-auto.cnf的配置文件达到持久化的目的在这个文件中用json的格式把设置的变量保存了下次重启mysql除了读取本身的配置文件也会读这个。
1.3.3、修改这些变量也可以修改用户级别alter uesr ‘用户名’’%’ password history 5;
这个策略的原理其实就是新增了一张历史密码记录表mysql.password_history每次密码的修改都会在这个表里记录起来。
1.4、新功能角色管理 这个角色的概念就和RBAC思想中的角色概念一样就是为了解决用户对应很多权限时管理混乱的问题。
使用步骤如下 定义角色create role ‘角色名称’; 角色绑定权限grant insert,update,delete on 数据库.* to ‘角色名称’; 用户绑定角色绑定完需要开启才能生效grant ‘角色名称’ to ‘用户名称’; 给某个用户开启默认角色set default role ‘角色名称’ to ‘用户名称’; 给某个用户开启所有角色set default role all to ‘用户名称’; 也可以用户登录启用角色set role ‘角色名称’; 最后查询验证用户的权限show grants for ‘角色名称’; 也可以查询该用户的角色拥有的具体权限show grants for ‘用户名称’ using ‘角色名称’; 撤销角色的权限revoke insert,update on 数据库.* from ‘角色名称’; 撤销角色的权限后相应角色对应的用户也就没有该权限了。
其实创建的那个角色是存在了mysql.user表中的也就是说mysql还是任务这个角色也是个用户只不过没有密码。 用户属于哪个角色在mysql.default_role表中。 角色授予了哪些用户在mysql.role_edges表中。
2、优化器索引
2.1、隐藏索引invisible
也叫不可见索引 8.0开始支持隐藏索引不会被优化器使用但数据修改时仍然需要后台维护。 可以通过看sql查询的执行计划explain sql看到效果。 将索引设置为可见alter table 表名 alter index 索引名 visible; 将索引设置为不可见alter table 表名 alter index 索引名 invisible; 主键不可以设置为不可见。 应用场景软删除索引灰度发布 如果生产环境中需要删除索引但害怕删除错了还需要新建这个索引那就可以先将这个索引设置为隐藏索引当上线完确认该索引的删除没有任何影响时可以再次真正删除这个索引。 生产环境中如果我们要新增一个索引可以先设置成隐藏索引然后灰度发布这时隐藏索引是不可用的但我们需要维护他。此时可以通过修改一个变量从而让当前会话的优化器发现这个索引从而看到效果但不会影响到其他会话相关步骤如下 执行select optimezer_switch\G 看到里面有个开关变量use_invisible_indexesoff 当前会话级别打开这个开关set session optimezer_switch“use_invisible_indexeson”;
2.2、降序索引
8.0之前的版本创建索引时可以指定是降序索引还是升序索引但最终是都创建了升序索引。 8.0开始支持真正的降序索引但只支持InnoDB引擎的BTREE支持降序索引。 实现真正的降序索引带来的好处是 之前版本如果查询时指定索引字段a是升序排序索引字段b是降序排序那么其实在看执行计划的时候可以发现真正执行时不仅用了索引还会用到其他的文件排序。 但8.0之后有了真正的降序索引后这种情况就只用索引就解决了。 8.0之前版本对于group by语句有一个隐式的排序。 8.0开始由于有了降序索引对于group by语句不在进行隐式排序了因为之前版本都是默认升序新版本既有升序又有降序就不能默认给group by指定了如果还有排序必须使用order by了。
2.3、函数索引
8.0.13版本开始支持函数索引了。 这个索引同时也支持降序索引也支持JSON数据的节点的索引。 这个函数索引是基于虚拟列功能实现的。 就是相当于给创建函数索引的这个字段新增加了一列值是对应字段通过函数运算后的结果这样就很好理解了吧其实我们之前的版本也有类似的解决方案就是新增一列每次新增的时候这一列存放的总是某列通过函数运算的结果最后就可以根据这列来查询了 alert table 表名 add column 新列名 类型 generated always as (函数(原始列名)); 这个sql就是让新列名总是等于原始列名数值运算函数的结果。 8.0.13只不过是对上面这种方案进行了包装不用这样新增一列并指定了直接可以创建一个原始列的函数索引达到相同的目的让人看起来更简洁而已。
创建普通索引create index 索引名字 on 表名(字段名) 创建函数索引create index 索引名字 on 表名(函数名(字段名)) 函数就是一些方法比如upper就是将字段转成大写。
使用场景 表中字段是商品名字product它的值有大写也有小写。 当我们在匹配查询的时候如果没有创建函数索引那查询where upper(product)‘ABCD’时必然是全表扫描。 如果我们事先针对这个字段创建了upper索引那查询的时候就能用上这个索引了。
JSON数据创建索引时可以指定给JSON中的哪个字段创建索引。目前个人感觉这个功能有点鸡肋。因为一般我们在设计表结构的时候就是避免存json这种类型的数据的即使存了那肯定是类似于文本的数据更不会根据里面的某个值进行查询了。所以这个功能可以忽略吧只能作为一个慢查询补救的优化方案。
3、SQL语句增强
8.0开始支持WITH子句with XX as ABC select * from XXXX相当于别名 其实就相当于可以用WITH关键字定义一个或多个变量不同的变量都可以指定一个表前面定义的变量可以被后面的变量使用然后后面查询的时候可以用这些个变量指定的表。
还有一种递归的WITH写法其实就相当于java中的for循环语句int i1;i100;i 所以其实就是sql中可以写递归了简单举例
with recursive 自定义别名(i) AS
(select 1union allselect i1 from 自定义别名 where i100
)
select * from 自定义别名上面这个sql最终返回的是一个列表[1,2,3…100]。 自定义别名(i)中的i就是循环变量where i100就是最终结束的条件 每次i1都会判断是否100如果满足条件则相当于查出一个i的值直到不满足条件最终把所有的值集合输出。
对于这个sql增强我目前没有看出特别合适用它的场景因为目前的开发模式对于数据库来说只需要提供简单的增删改查和事务即可其他功能相对用的少点所以我断定这个功能目前来没啥意思。
4、新增数据分析函数
新增关键字OVER用法
OVER(partition by 字段名 order by 字段名 自定义
)
partition by用于分组和我们常用的的group by一个意思
order by这个直接连名字都不改了就是对分完组的每个组内的数据排序
最后这个自定义也是作用于分完组的每个组内可以更详细的对组内的数据进行筛选比如可以指定组内从第一个到当前每次都可以取出从第一个到当前行的总和等等功能。并新增了一些函数方法比如排名函数等同时之前的像SUM等也可以当成这个分析函数。 其实就是对group by的一些聚合函数做了变种group by是有几组就是几条结果这个新增的分析函数是原数据有几条就展示几条并没有聚合。
总体而言这个也没啥根本上的改进还是在原来的基础上增强而且貌似增加了复杂性平均学习成本稍高或许对部分报表业务用这个会比较合适但对于大部分人估计没多少人会用这个。
5、InnoDB增强
5.1、优化了一些元数据文件
在/var/lib/mysql/某个数据库下删掉了很多基于文件的数据信息比如.frm文件.MYD文件.MYI文件其实是将这些文件信息存在了一个叫 库名.ibd 的文件下了
5.2、将系统表mysql和数据字典表全部改为InnoDB引擎
5.3、提高了对数据字典表的访问性能
5.4、DDL操作可以是原子性的了
比如DDL修改两个字段第一个成功第二个失败那最终结果是都失败。8.0版本之前这种情况第一个仍然成功第二个失败这就是差别。
5.5、自增列持久化
8.0版本之前自增列计数器是保存在内存中的服务重启后需要重新读取自增列最大值然后生成最新的自增列最大声这样做特殊情况下可能会重复这还是一个8.0版本前长久的bug。
简答说下老版本这个bug
比如自增列是id已有id自增到10某个时刻删除这个10的数据然后重启然后再新增一条数据
如果不重启新增的数据的自增id应该是11
但如果重启后新增的数据的自增id就还是10因为重启后系统扫描这个表会发现最大id是9然后新增的话自然就是10了
这其实是我们不愿意看到的情况因为id为10的这条记录虽然被删了但如果新增数据我们还是希望id是11而不是108.0版本是把自增列计数器在每次变化的时候写入redo log中这个持久化操作其实是说解决了自增列可能会重复的bug
5.6、自增列自动感知最大值
老版本的自增列比如自增到10了如果这时手动把之前id为1的数据的id改为11那么再次新增会报错因为新增的这条数据自增计数器给分配的id是11但其实数据库中已经有11了。 新版本针对这个做了优化不会报错了而且会感知到id变为11的操作然后新增会接着从12开始。
5.7、死锁检查
8.0新增加了一个动态变量innodb_deadlock_detect用于控制系统是否执行InnoDB的死锁检查默认打开。 开了这个死锁检查后如果出现两个事物死锁系统会立刻让一个事物失败。 死锁检查会对性能有较为明显的影响为了提高性能可以将这个功能关闭。 老版本针对这种死锁的情况其实是有一个超时时间的超过这个时间也会让一个事物失效。这个超时时间由一个变量控制innodb_lock_wait_timeout,好像默认是50秒我猜新版本这个死锁检查会不会就是相当于把这个值给调小到某个值然后用另一个开关控制一下。
5.8、锁定语句新增选项只针对行锁
老版本中有一种sql: select … for update 这个是如果查的这个语句有改就等改完再返回。 新版本针对这种情况作了加强语句后可以新增 nowait和skip locked 两种选项选项。 select … for update nowait; nowait就是不等了碰到行锁立刻返回。 select … for update skip locked; skip locked就是跳过这条正在修改的只把没行锁的返回。 这个功能还有点用比如类似于查询火车票余票的场景如果查询的同时发现有些票正在被修改那就直接返回或者跳过这些票。
5.9、支持部分快速DDL
alert table … algorithminstant 这样就可以避免一些数据复制比以前普通的DDL操作要快很多线上环境很适合这样搞。
5.10、InnoDB临时表空间优化
使用了共享的临时表空间ibtemp1。
5.11、新增静态变量innodb_dedicated_server
如果有一台服务器是专门只装mysql的那么打开这个参数系统会自动配置InnoDB内存参数innodb_buffer_pool_sizeinnodb_log_file_size等会尽量占用系统资源从而提高系统性能
5.12、其他
6、JSON相关
6.1、新增内联路径操作符
新增JSON操作符column-path 等价于老版本的JSON_UNQUOTE(column-path) 也等价于老版本的JSON_UNQUOTE(JSON_EXTRACT(column,path)) column是json存取的字段名如果json中有个name属性 path就是$.name
6.2、新增json函数
JSON_ARRAYAGG()用于生成json数组括号中是一个列名 JSON_OBJECTAGG()用于生成json对象括号中可以是多个列名逗号隔开 JSON_PRETTY()美化json输出格式 JSON_STORAGE_SIZE()可以查看json列所占用的大小单位字节。 其实这四个个函数5.7.22就增加了 JSON_STORAGE_FREE()可以查看json列释放出来的大小单位字节实际占用的可能比这个大这个是实际大小。 JSON_MERGE_PATCH()将两个json对象合并成一个相同节点取最后一个节点的值 JSON_MERGE_PRESERV()将两个json对象合并成一个相同节点都保留 由于上面这个函数的功能就是老版本的JSON_MERGE()函数的功能所以新版版废弃了JSON_MERGE()函数 JSON_TABLE()将json数据转换为关系表可以将这个函数的返回结果当做一个普通的表并且可以使用sql查询 这个其实和前面第一第二个函数是相反的操作
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86893.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!