MySQL8.0版本新特性
具体特性可以看官方文档 1.3 MySQL 8.0 中的新功能 (oracle.com)
1.默认字符由latin1变成utf8mb4
2.MyISAM系统表全部换成InnoDB表
可以使用 select distinct(ENGIN) from information_schema.tables
语句进行查看
3.自增变量持久化
8.0版本之前:自增主键 AUTO_INCREMENT的值如果大于 max(primayr key) + 1
,在MySQL重启后,会重置 AUTO_INCREMENT = max(primary key) + 1
。
8.0版本之后,会对AUTO_INCREMENT值进行持久化,MySQL重启后,该值不会改变。
4.参数修改持久化
8.0版本支持在线修改全局参数并持久化,通过 PERSIST
关键字,将修改的参数持久化到 mysqld-auto.cnf
配置文件中,当MySQL重启时,可以从该配置文件获取到最新的配置参数。
5.新增降序索引
MySQL语法上很早就支持降序索引了,但是实际上创建的仍然是升序索引。可通过 show create table
来查看。
降序索引只是对查询中特定的排序顺序有效。
6.group by 不再隐式排序
8.0版本对于 group by 字段不再隐式排序,如果需要排序,必须显示加上 order by 子句。
7.JSON特性增强
MySQL8.x版本大幅改进了对JSON的支持,
- 增加了
JSON_EXTRACT()
:基于路径查询参数从JSON字段中抽取数据 JSON_ARRAYAGG()
&JSON_OBJECTAGG()
:将数据分别组合到JSON数组和对象中
主从复制中,新增binlog_row_value_option
参数,控制JSON数据的传输方式,允许对JSON类型部分修改,在binlog中只记录修改的部分,减少JSON大数据在只有少量修改的情况下,对资源的占用。
8.redo & undo 日志加密
新增两个参数:
- innodb_redo_log_encrypt
- innodb_undo_log_encrypt
9.innodb select for update 跳过锁等待
5.7及以前版本,select...for update
语句若获取不到锁则会一直等待,直到innodb_lock_wait_timeout
超时。
8.0版本,新增 NOWAIT、SKIP LOCKED 语法,跳过锁等待或锁定,立即返回。
- NOWAIT:若查询的行已经加锁,会立即报错返回。
- SKIP LOCKED:也会立即返回,但是不报错,只是返回的结果不包含被锁定的行
10.支持不可见索引
visible
INVISIBLE
关键字在创建表或进行表变更时可设置索引是否可见,索引不可见只是在查询时优化器不使用该索引(force index 下也不使用),同时优化器也不会报索引不存在错误,因为索引仍然是真实存在的。