MySQL 8新特性
目录
MySQL 新特性
MySQL 新特性
-
新增 JSON 数据类型
在 5.7.8 版本之后,MySQL 新增了一个原生的 JSON 数据类型,JSON 值将不再以字符串的形式存储,而是采用一种允许快速读取文本元素(document elements)的内部二进制(internal binary)格式;在 JSON 列插入或者更新的时候将会自动验证 JSON 文本,未通过验证的文本将产生一个错误信息。
之前如果要存储 JSON 类型的数据的话我们只能自己做 JSON.stringify() 和 JSON.parse() 的操作,而且没办法针对 JSON 内的数据进行查询操作,所有的操作必须读取出来 parse 之后进行,非常的麻烦。原生的 JSON 数据类型支持之后,我们就可以直接对 JSON 进行数据查询和修改等操作了,较之前会方便非常多。
MySQL 8 大幅改进了对 JSON 的支持,在主从复制中,新增参数 binlog_row_value_options,控制 JSON 数据的传输方式,允许对于 JSON 类型部分修改,在binlog中只记录修改的部分,减少JSON大数据在只有少量修改的情况下,对资源的占用。
-
默认字符集由 latin1 变为 utf8mb4
在 MySQL 8.0 版本之前,默认字符集为 latin1,utf8 指向的是 utf8mb3,8.0版本默认字符集为 utf8mb4,utf8 默认指向的也是 utf8mb4。
-
MyISAM 系统表全部换成 InnoDB 表
MySQL 8.0 版本之后系统表全部换成了事务型的 Innodb 表,默认的 MySQL 实例将不包含任何 MyISAM 表,除非手动创建 MyISAM 表。
-
自增变量持久化
在 MySQL 8.0 之前的版本,自增主键 AUTO_INCREMENT 的值如果大于 max(primary key)+1,在 MySQL 重启后,会重置 AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。
-
DDL 原子化
MySQL 8.0 版本之后 InnoDB 表的 DDL 支持事务完整性,要么成功要么回滚,例如,数据库里只有一个t1表,执行
drop table t1,t2
语句试图删除t1,t2两张表,在 5.7 中,执行报错,但是 t1 表被删除,在 8.0 中执行报错,但是 t1 表没有被删除,证明了 8.0 DDL操作的原子性,要么全部成功,要么失败回滚。 -
参数修改持久化
MySQL 8.0 版本支持在线修改全局参数并持久化,通过加上 PERSIST 关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中,重启 MySQL 时,可以从该配置文件获取到最新的配置参数。
-
group by 不再隐式排序
MySQL 8.0 对于group by 字段不再隐式排序,如需要排序,必须显式加上 order by 子句。
-
支持不可见索引
MySQL 8.0 支持不可见索引, 使用INVISIBLE关键字在创建表或者进行表变更中设置索引是否可见,索引不可见只是在查询时优化器不使用该索引,即使使用 force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在,在必要时,也可以快速的恢复成可见。
-
新增 innodb_dedicated_server 参数
MySQL 8.0 新增 innodb_dedicated_server 参数,能够让InnoDB根据服务器上检测到的内存大小自动配置 innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method 三个参数。
-
增加角色管理
MySQL 8.0 增加角色管理,通常,MySQL 数据库拥有多个相同权限集合的用户。以前,向多个用户授予和撤销权限的唯一方法是单独更改每个用户的权限,假如用户数量比较多的时候,这是非常耗时的,为了用户权限管理更容易,MySQL 提供了一个名为 role 的新对象,它是一个命名的特权集合。
-
克隆功能
MySQL 8.0 clone 插件提供从一个实例克隆数据的功能,克隆功能提供了更有效的方式来快速创建MySQL实例,用于自动搭建从节点,也可用于备份 innodb 表,增强了 MySQL InnoDB Cluster。
在 MySQL 克隆功能出现之前,如果想将一个单机MySQL实例升级为高可用实例,或者一个 MySQL 节点由于硬件故障等原因需要重建时首先需要通过 xtrabackup 或mydumper 等物理或逻辑备份工具从正常的 MySQL 节点上进行一个全量备份,然后基于这个全量备份配置正确的 Binlog 相关参数,最后通过 change master to 和 start slave 等命令使新建的 MySQL 节点与所需的 MySQL 节点建立复制关系等待一系列复杂的操作。
-
binlog 日志压缩
MySQL 从 8.0.20 增加了 binlog 日志事务压缩功能,开启压缩功能后,将事务信息使用 zstd 算法进行压缩,然后再写入 binlog 日志文件,降低了原文件占用的磁盘空间和网络带宽传输。
-
连接管理
在 MySQL 8.0 版本中,对连接管理这一块,先后做了两个比较大的改变:一个是允许额外连接,另一个是专用的管理端口。在 MySQL 8.0 版本中,在当前连接数达到最大连接数时,服务端允许1个额外连接,可以让具有 CONNECTION_ADMIN 权限的用户连接进来,并且允许具有 SERVICE_CONNECTION_ADMIN 权限的用户,通过特定的 IP 和 PORT 连接上来,且没有连接数限制。
-
取消 Query Cache
MySQL 8.0 开始,取消了查询缓存,经过时间的考验,MySQL 的工程团队发现启用缓存的好处并不多。
首先,查询缓存的效果取决于缓存的命中率,只有命中缓存的查询效果才能有改善,因此无法预测其性能;其次,查询缓存的另一个大问题是它受到单个互斥锁的保护,在具有多个内核的服务器上,大量查询会导致大量的互斥锁争用;最后,相对来说,缓存越靠近客户端,获得的好处越大。
-
允许禁用 redo log
MySQL 8.0.21 开始可以禁用 redo log 来提升数据库的写性能,但降低了安全性,适用于某些对安全要求较低的场景。