1、默认字符集由latin1变为utf8mb4
2、MyISAM系统表全部换成InnoDB表
系统表全部换成事务型的innodb表,默认的MySQL实例将不包含任何MyISAM表,除非手动创建MyISAM表
3、自增变量持久化
在mysql8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在mysql重启后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题、自增主键重启重置的问题很早就被发现(https://bugs.mysql.com/bug.php?id=199),一直到8.0才被解决,8.0版本将会对AUTO_INCREMENT值进行持久化,MySQL重启后,该值将不会改变。
4、DDL原子化
InnoDB表的DDL支持事务完整性,要么成功要么回滚,将DDL操作回滚日志写入到data dictionary数据字典表mysql.innodb_ddl_log中用于回滚操作,该表是隐藏的表,通过show tables 无法看到,通过设置参数,可以将ddl操作日志打印输出到mysql错误日志中;
5、参数修改持久化
mysql8.0版本支持在线修改全局参数并持久化,通过加上persist关键字,可以将修改的参数持久化到最新的配置文件中(mysql-auto.cnf)中,重启mysql时,可以从该配置文件获取到最新的配置参数;
例如执行:
set PERSIST expire_logs_days=10 ;
系统会在数据目录下生成一个包含json格式的 mysqld-auto.cnf 的文件,格式化后如下所示,当 my.cnf 和 mysqld-auto.cnf 同时存在时,后者具有更高优先级。
{
"Version": 1,
"mysql_server": {
"expire_logs_days": {
"Value": "10",
"Metadata": {
"Timestamp": 1559118365909423,
"User": "root",
"Host": "localhost"
}
},
"wait_timeout": {
"Value": "1900",
"Metadata": {
"Timestamp": 1559118841863580,
"User": "root",
"Host": "localhost"
}
}
}
}
6、新增降序索引
MySQL在语法上很早就已经支持降序索引,但实际上创建的仍然是升序索引,如下MySQL 5.7 所示,c2字段降序,但是从show create table看c2仍然是升序。8.0可以看到,c2字段降序。
mysql5.7
7、group by 不再隐式排序
mysql 8.0 对于group by 字段不再隐式排序,如需要排序,必须显式加上order by 子句。
8、JSON特性增强
9、redo & undo 日志加密
增加以下两个参数,用于控制redo、undo日志的加密。
10、innodb select for update跳过锁等待
select ... for update,select ... for share(8.0新增语法) 添加 NOWAIT、SKIP LOCKED语法,跳过锁等待,或者跳过锁定。
在5.7及之前的版本,select...for update,如果获取不到锁,会一直等待,直到innodb_lock_wait_timeout超时。
在8.0版本,通过添加nowait,skip locked语法,能够立即返回。如果查询的行已经加锁,那么nowait会立即报错返回,而skip locked也会立即返回,只是返回的结果中不包含被锁定的行。
11、支持不可见索引
使用INVISIBLE关键字在创建表或者进行表变更中设置索引是否可见。索引不可见只是在查询时优化器不使用该索引,即使使用force index,优化器也不会使用该索引,同时优化器也不会报索引不存在的错误,因为索引仍然真实存在,在必要时,也可以快速的恢复成可见
不可见索引能够很方便索引对于查询的性能的影响,对于生产上的大表来说,删除或增加索引的代价非常大
12、新增innodb_dedicated_server参数
能够让InnoDB根据服务器上检测到的内存大小自动配置innodb_buffer_pool_size,innodb_log_file_size,innodb_flush_method三个参数
(官方不建议,除非在该机器上只跑了该mysql进程)
13、增加角色管理
角色可以认为是一些权限的集合,为用户赋予统一的角色,权限的修改直接通过角色来进行,无需为每个用户单独授权。
14、增加连接错误认证延时登录插件
引入了一个新的插件,代码在plugin/connection_control/下,该插件使用的是audit plugin接口,其功能是在数次登陆失败后,会延迟下次登陆的时间,这也有点类似于多次密码输入错误,会被冻结一会的意思。在lib/plugin目录下,我们已经编译好了插件connection_control.so,安装也比较简单:
15、支持双重密码
这也是个有趣的特性,意思是支持一个账户两个密码,这通常发生在你修改了密码,但又不想导致正在运行的业务中断时。如worklog所述,当你有大规模的复制集群时,又想修改复制密码,当然不希望正在进行的复制中断拉。那怎么办,可以在保持两个密码在一段时间内都是有效的。用法也比较简单,我们举个简单的例子:
mysql.user表被扩展了来存储两个密码,主密码存储在mysql.user.authentication_string中,次要密码存储在mysql.user.user_attributes中