数据库版本
目前云数据库 MySQL 支持以下版本:MySQL 5.6、MySQL 5.7、MySQL 8.0,各版本的特性请参考 官方文档 (opens new window)。
# MySQL 5.6 特性
- GTID 复制
- 无损复制
- 延迟复制
- 基于库级别的并行复制
- mysqlbinlog 可远程备份 binlog
- 对 TIME, DATETIME 和 TIMESTAMP 进行了重构,可支持小数秒。DATETIME 的空间需求也从之前的 8 个字节减少到 5 个字节
- Online DDL。ALTER操作不再阻塞DML
- 可传输表空间(transportable tablespaces)
- 统计信息的持久化。避免主从之间或数据库重启后,同一个SQL的执行计划有差异
- 全文索引
- InnoDB Memcached plugin
- EXPLAIN 可用来查看 DELETE,INSERT,REPLACE,UPDATE 等 DML 操作的执行计划,在此之前,只支持 SELECT 操作
- 分区表的增强,包括最大可用分区数增加至 8192,支持分区和非分区表之间的数据交换,操作时显式指定分区
- Redo Log 总大小的限制从之前的 4G 扩展至 512G
- Undo Log 可保存在独立表空间中,因其是随机 IO,更适合放到 SSD 中。但仍然不支持空间的自动回收
- 可 dump 和 load Buffer pool 的状态,避免数据库重启后需要较长的预热时间
- InnoDB 内部的性能提升,包括拆分 kernel mutex,引入独立的刷新线程,可设置多个 purge 线程
- 优化器性能提升,引入了 ICP,MRR,BKA 等特性,针对子查询进行了优化
# MySQL 5.7 特性
- 组复制
- InnoDB Cluster
- 多源复制
- 增强半同步(AFTER_SYNC)
- 基于 WRITESET 的并行复制
- 在线开启 GTID 复制
- 在线设置复制过滤规则
- 在线修改 Buffer pool 的大小
- 在同一长度编码字节内,修改 VARCHAR 的大小只需修改表的元数据,无需创建临时表
- 可设置 NUMA 架构的内存分配策略(innodb_numa_interleave)
- 透明页压缩(Transparent Page Compression)
- UNDO 表空间的自动回收
- 查询优化器的重构和增强
- 可查看当前正在执行的 SQL 的执行计划(EXPLAIN FOR CONNECTION)
- 引入了查询改写插件(Query Rewrite Plugin),可在服务端对查询进行改写
- EXPLAIN FORMAT = JSON 会显示成本信息,这样可直观的比较两种执行计划的优劣
- 引入了虚拟列,类似于 Oracle 中的函数索引
- 新实例不再默认创建 test 数据库及匿名用户
- 引入 ALTER USER 命令,可用来修改用户密码,密码的过期策略,及锁定用户等
- mysql.user 表中存储密码的字段从 password 修改为 authentication_string
- 表空间加密
- 优化了 Performance Schema,其内存使用减少
- Performance Schema 引入了众多 instrumentation 。常用的有Memory usage instrumentation,可用来查看 MySQL 的内存使用情况,Metadata Locking Instrumentation,可用来查看 MDL 的持有情况,Stage Progress instrumentation,可用来查看 Online DDL 的进度
- 同一触发事件(INSERT,DELETE,UPDATE),同一触发时间(BEFORE,AFTER),允许创建多个触发器。在此之前,只允许创建一个触发器
- InnoDB 原生支持分区表,在此之前,是通过 ha_partition 接口来实现的
- 分区表支持可传输表空间特性
- 集成了 SYS 数据库,简化了 MySQL 的管理及异常问题的定位
- 原生支持 JSON 类型,并引入了众多 JSON 函数
- 引入了新的逻辑备份工具 - mysqlpump,支持表级别的多线程备份
- 引入了新的客户端工具 - mysqlsh,其支持三种语言:JavaScript, Python and SQL。两种 API:X DevAPI,AdminAPI,其中,前者可将 MySQL 作为文档型数据库进行操作,后者用于管理InnoDB Cluster
- mysql_install_db 被 mysqld --initialize 代替,用来进行实例的初始化
- 原生支持 systemd
- 引入了 super_read_only 选项
- 可设置 SELECT 操作的超时时长(max_execution_time)
- 可通过 SHUTDOWN 命令关闭 MySQL 实例
- 引入了 innodb_deadlock_detect 选项,在高并发场景下,可使用该选项来关闭死锁检测
- 引入了 Optimizer Hints,可在语句级别控制优化器的行为,如是否开启 ICP,MRR 等,在此之前,只有 Index Hints
- GIS 的增强,包括使用 Boost.Geometry 替代之前的 GIS 算法,InnoDB 开始支持空间索引
# MySQL 8.0 特性
- 引入了原生的,基于 InnoDB 的数据字典。数据字典表位于 mysql 库中,对用户不可见,同mysql 库的其它系统表一样,保存在数据目录下的 mysql.ibd 文件中。不再置于 mysql 目录下
- Atomic DDL
- 重构了 INFORMATION_SCHEMA,其中,部分表已重构为基于数据字典的视图,在此之前,其为临时表
- PERFORMANCE_SCHEMA 查询性能提升,其已内置多个索引
- 不可见索引(Invisible index)
- 降序索引
- 直方图
- 公用表表达式(Common table expressions)
- 窗口函数(Window functions)
- 角色(Role)
- 资源组(Resource Groups),可用来控制线程的优先级及其能使用的资源,目前,能被管理的资源只有CPU
- 引入了 innodb_dedicated_server 选项,可基于服务器的内存来动态设置 innodb_buffer_pool_size,innodb_log_file_size 和 innodb_flush_method
- 快速加列(ALGORITHM=INSTANT)
- JSON 字段的部分更新(JSON Partial Updates)
- 自增主键的持久化
- 可持久化全局变量(SET PERSIST)
- 默认字符集由 latin1 修改为 utf8mb4
- 默认开启 UNDO 表空间,且支持在线调整数量(innodb_undo_tablespaces)。在 MySQL 5.7 中,默认不开启,若要开启,只能初始化时设置
- 备份锁
- Redo Log 的优化,包括允许多个用户线程并发写入 log buffer,可动态修改 innodb_log_buffer_size 的大小
- 默认的认证插件由 mysql_native_password 更改为 caching_sha2_password
- 默认的内存临时表由 MEMORY 引擎更改为 TempTable 引擎,相比于前者,后者支持以变长方式存储 VARCHAR,VARBINARY 等变长字段。从 MySQL 8.0.13 开始,TempTable 引擎支持 BLOB 字段
- Grant 不再隐式创建用户
- SELECT ... FOR SHARE 和 SELECT ... FOR UPDATE 语句中引入 NOWAIT 和 SKIP LOCKED 选项,解决电商场景热点行问题
- 正则表达式的增强,新增了 4 个相关函数,REGEXP_INSTR(),REGEXP_LIKE(),REGEXP_REPLACE(),REGEXP_SUBSTR()
- 查询优化器在制定执行计划时,会考虑数据是否在 Buffer Pool 中。而在此之前,是假设数据都在磁盘中
- ha_partition 接口从代码层移除,如果要使用分区表,只能使用 InnoDB 存储引擎
- 引入了更多细粒度的权限来替代 SUPER 权限,现在授予 SUPER 权限会提示 warning
- GROUP BY 语句不再隐式排序
- MySQL 5.7 引入的表空间加密特性可对 Redo Log 和 Undo Log 进行加密
- information_schema 中的 innodb_locks 和 innodb_lock_waits 表被移除,取而代之的是 performance_schema 中的 data_locks 和 data_lock_waits 表
- 引入 performance_schema.variables_info 表,记录了参数的来源及修改情况
- 增加了对于客户端报错信息的统计(performance_schema.events_errors_summary_xxx)
- 可统计查询的响应时间分布(call sys.ps_statement_avg_latency_histogram())
- 支持直接修改列名(ALTER TABLE ... RENAME COLUMN old_name TO new_name)
- 用户密码可设置重试策略(Reuse Policy)
- 移除 PASSWORD() 函数。这就意味着无法通过 “SET PASSWORD ... = PASSWORD('auth_string') ” 命令修改用户密码
- 代码层移除 Query Cache 模块,故 Query Cache 相关的变量和操作均不再支持
- BLOB, TEXT, GEOMETRY 和 JSON 字段允许设置默认值
- 可通过 RESTART 命令重启 MySQL 实例