侧边栏壁纸
  • 累计撰写 35 篇文章
  • 累计创建 14 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

MySQL8.0的部分新特性

子曰
2023-08-10 / 0 评论 / 0 点赞 / 654 阅读 / 1,624 字 / 正在检测是否收录...

mysql8.0新增的特性主要有以下几个方面:

1.账户与安全

1)用户创建和授权是分开的,并修改了默认的认证插件。

2)增加了密码重用策略,支持修改密码时要求用户输入当前密码。
  3)支持角色功能。

提高了用户和密码管理的安全性,方便了权限的管理。

2.优化器索引

三种新的索引方式

1)支持隐藏索引,方便索引的维护和性能调试。

2)支持降序索引,提高了特定场景的查询性能。

3)支持函数索引,扩展了索引支持的数据类型,可以对更多的数据类型进行索引。

3.通用表表达式(Common Table Expressions:CTE)

1)非递归CTE,提高查询的性能和代码的可读性。

2)递归CTE,支持通过对数据遍历和递归的实现完成SQL实现强大复杂的功能。

4.窗口函数(Window Functions)

是一种新的查询方式。窗口函数有两类,一类上传统的聚合函数作为窗口函数使用,另一类是专用的窗口函数。可以实现复杂的数据分析能力。

5.InnoDB存储引擎增强

1)新的数据字典可以对元数据统一的管理,同时也提高了更好的查询性能和可靠性。

2)原子DDL的操作,提供了更加可靠的管理。

3)自增列的持久化,解决了长久以来自增列重复值的bug。

4)死锁检查控制,可以选择在高并发的场景中关闭,提高对高并发场景的性能。

5)锁定语句选项,可以根据不同业务需求来选择锁定语句级别。

6.JSON增强

新的运算符及JSON相关函数。

mysql8.0新特性更多可以查看这篇:https://mysqlserverteam.com/whats-new-in-mysql-8-0-generally-available/

7.原子ddl

  1. 删除库、表
drop table test1,test2;

MySQL8.0中,当没有test2的时候,并没有删除test1这个表,它将整个语句完全回滚;而MySQL5.7中,误删除了test1这个表,没有将整个语句完全回滚。

基于这种处理机制的不同,因此,我们在使用MySQL5.7版本和MySQL8.0版本做主从复制的时候,如果使用了类似上面的语句,就会发生报错。因为二者的执行行为已经不一样了。要想解决这个问题,需要使用drop table if not exists语法,同样的,针对drop database、drop trigger等一系列操作,处理方法类似。还有一点值得注意,如果一个数据库中的所有表都是innodb的,那么drop database才是原子的,否则,drop database不是原子的。

  1. Create Table…Select 语法:

从MySQL 8.0.21开始,在支持原子DDL的存储引擎上,当使用基于row的复制模式时,CREATE TABLE…SELECT…,该语句作为一个事务记录在二进制日志中。之前的版本中,它被记录为两个事务,一个用于create表,另一个用于insert数据。两个事务之间或插入数据时发生服务器故障可能导致复制了一张空表。通过引入原子DDL支持,CREATE TABLE …SELECT语句现在对于基于行的复制是安全的,并且允许与基于GTID的复制一起使用。

  1. 日志查看

    为了支持DDL操作的redo和rollback,InnoDB将DDL日志写入mysql.innodb_ddl_log表中,这个表存在于数据字典表空间中,如果用户想要看这个表里面的内容,需要打开参数:innodb_print_ddl_logs,然后就可以在error log日志中看到ddl操作的日志了。

    mysql.innodb_ddl_log这个表的刷盘时机不受innodb_flush_logs_at_trx_commit参数的影响,这么做的目的是为了避免数据文件被DDL操作修改了,但是对应的redo log还没有刷新到磁盘,导致恢复或者回滚的时候报错。

    最后,我们介绍下整个原子DDL操作的几个阶段:

    1、准备阶段:创建需要的对象,写入DDL log到mysql.innodb_ddl_log表,DDl log定义了如何前滚和回滚DDL操作

    2、执行阶段:执行DDL的操作流程

    3、提交阶段:更新数据字典,并提交数据字典事务

    4、Post-DDL阶段:从mysql.innodb_ddl_log表重放并删除DDL日志。为了确保可以安全地执行回滚而不会引起不一致,在此最后阶段执行磁盘上的文件操作,例如重命名或删除数据文件。此阶段还将从mysql.innodb_dynamic_metadata数据字典表中删除动态元数据,以用于DROP TABLE,TRUNCATE TABLE和其他重建表的DDL操作。

InnoDB将DDL日志写入 mysql.innodb_ddl_log表以支持重做和回滚DDL操作。该 mysql.innodb_ddl_log表是隐藏在mysql.ibd数据字典表空间中的隐藏数据字典表 。与其他隐藏数据字典表一样,mysql.innodb_ddl_log在非调试版本的MySQL中无法直接访问该 表。

8.创建用户

在8.0中不再使用grant语句来创建用户了,会提示语法错误。

9.认证插件更新

认证插件改为了默认成了caching_sha2_password,加密方式与mysql_native_password是不同的。需要注意,有时候提示密码错误不一定是密码不对,可能是密码认证方式的问题。

如果想兼容5.7的使用习惯,可在配置文件中增加default_authentication_plugin =mysql_native_password

在登录mysql时,可以使用

mysql -h x.x.x.x -P 3306 -u xx -p xxxxx --default-auth=mysql_native_password

10. 持久化参数

-- 例子
SET PERSIST max_connections = 3000;

参考文档:
https://www.lingxi.site/archives/1691635774

0

评论区