新增的新特性
更简便的NoSQL支持。 更好的索引,新增了隐藏索引
和降序索引
。隐藏索引
可以用来去掉索引对查询性能的影响。在查询中混合存在多列索引时
,使用降序索引
可以提高查询的性能。 更完善的JSON支持,增加了聚合函数,JSON_ARRAYAGG()
和JSON_OBJECTAGG()
,将参数聚合为JSON数组或对象,新增了行内操作符->>
,是列路径运算符->
的增强,对JSON排序做了提升,并优化了JSON的更新操作。 安全和账户管理,新增了caching_sha2_password授权插件、角色、密码历史记录和FIPS模式支持,这些提高了数据库的安全性。 InnoDB的变化,InnoDB是MySQL默认的存储引擎,是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。在MySQL8.0中,InnoDB在自增、索引、加密、死锁、共享锁等方面做了大量的改进和优化,并且支持原子数据定义语言(Automic DDL),提高了数据安全性,对事务提供更好的支持。 数据字典,在之前的MySQL版本中,字典数据都存储在元数据文件和非事务表中。从MySQL8开始,新增了事务数据字典,在这个字典里存储着数据库对象信息,这些数据字典存储在内部事务表中。 原子数据定义语句(Automic DDL, 也叫原子DDL),MySQL8开始,InnoDB支持。原子DDL将与DDL操作相关的数据字典更新、存储引擎操作、二进制日志谢日结合到一个单独的原子事务中,这使得及时服务器崩溃,事务也会提交或回滚。使用支持原子操作的存储引擎所创建的表,在执行DROP TABLE、CREATE TABLE、ALTER TABLE、RENAME TABLE、TRUNCATE TABLE、CREATE TABLESPACE、DROP TABLESPACE等操作时,都支持原子操作,即事务要么完全操作成功,要么失败后回滚,不在进行部分提交。 资源管理,开始支持创建和管理资源组。 字符集支持,默认的字符集从latin1更改为utf8mb4,并首次添加了日语所特定使用的集合,utf8mb4_ja_0900_as_cs。 优化器增强,MySQL优化器开始支持隐藏索引
和降序索引
。隐藏索引不会被优化器使用,验证索引的必要性时不需要删除索引,先将索引隐藏,如果优化器性能无影响就可以真正地删除索引。降序索引允许优化器对多个列进行排序,并且允许排序顺序不一致。 公用表表达式(Common Table Expressions),简称为CTE,MySQL现在支持递归
和非递归
两种形式地CTE。CTE通过在SELECT语句或者其他特定语句前使用WITH语句对临时结果集
进行命名。 窗口函数,开始支持窗口函数,之前版本的大部分聚合函数在MySQL8中也可以作为窗口函数来使用。 正则表达式支持,MySQL在8.0.4以后的版本中,采用支持Unicode的国际化组件库实现正则表达式操作,这种方式不仅能提供完全的Unicode支持,而且时多字节安全编码。MySQL增加了REGEXP_LIKE()、 EGEXP_INSTR()、REGEXP_REPLACE()和 REGEXP_SUBSTR()等函数来提升性能。另外,regexp_stack_limit和regexp_time_limit 系统变量能够通过匹配引擎来控制资源消耗。 内部临时表,TempTable存储引擎取代MEMORY存储引擎成为内部临时表的默认存储引擎。TempTable存储引擎为VARCHAR和VARBINARY列提供高效存储。internal_tmp_mem_storage_engine会话变量定义了内部临时表的存储引擎,可选的值有两个,TempTable和MEMORY,其中TempTable为默认的存储引擎。temptable_max_ram系统配置项定义了TempTable存储引擎可使用的最大内存数量。 日志记录,在MySQL8中错误日志子系统由一系列MySQL组件构成。这些组件的构成由系统变量log_error_services来配置,能够实现日志事件的过滤和写入。 增强的MySQL复制,MySQL8复制支持对JSON文档进行部分更新的二进制日志记录,该记录使用紧凑的二进制格式,从而节省记录完整JSON文档的空间。当使用基于语句的日志记录时,这种紧凑的日志记录会自动完成,并且可以通过将新的binlog_row_value_options系统变量值设置为PARTIAL_JSON来启用。
移除的旧特性
查询缓存,删除的项有
语句,FLUSH QUERY CACHE
和RESET QUERY CACHE
系统变量,query_cache_limit、query_cache_min_res_unit、query_cache_size、query_cache_type、query_cache_wlock_invalidate 线程变量,checking privileges on cached query、checking query cache for query、invalidating query cache entries、sending_cached result to client、storing result in query cache、waiting for query cache lock 加密相关,删除的内容有:ENCODE()
、DECODE()
、ENCRYPT()
、DES_ENCRYPT()
和DES_DECRYPT()
函数,配置项des-key-file
,系统变量have_crypt
,FLUSH语句的DES_KEY_FILE
选项,HAVE_CRYPT CMake
选项。对于移除的ENCRYPT()函数
,考虑使用SHA2()
替代,对于其他移除的函数,使用AES_ENCRYPT()
和AES_DECRYPT()
替代 空间函数相关,只保留了ST_
和MBR
函数 \N和NULL,在SQL语句中,解析器不再将\N视为NULL
,所以在SQL语句中应使用NULL代替\N
。这项变化不会影响使用LOAD DATA INFILE 或者SELECT…INTO OUTFILE操作文件的导入和导出。在这类操作中,NULL仍等同于\N mysql_install_db,被移除,数据字典的初始化需要调用带着initialize
或者--initialize-insecure
选项的mysqld来代替实现。另外,--bootstrap
和INSTALL_SCRIPTDIRCMake
也被删除。 通用分区处理程序,被移除,为了实现给定表分区,表所使用的存储引擎需要自有的分区处理程序。提供本地分区支持的MySQL存储引擎有两个,即InnoDB和NDB,而在MySQL8中只支持InnoDB
系统和状态变量信息,在INFORMATION_SCHEMA数据库中,对系统和状态变量不在进行维护。GLOBAL_VARIABLES
、SESSION_VARIABLES
、GLOABL_STATUS
、SESSION_STATUS
表都已被删除。另外,系统变量show_compatibility_56也已被删除。被删除的状态变量还有Slave_retried_transactions
、Slave_running
。以上被删除的内容都可以使用性能模式中对应的内容进行代替。 mysql_plugin工具,mysql_plugin工具用来配置MySQL服务器插件,现已被删除,可使用--plugin-load
或者--plugin-load-add
选项在服务器启动时加载插件或者在运行时使用INSTALL PLUGIN
语句加载插件来替代该工具。