分布式融合数据库HTAP高度兼容 MySQL 5.7 的网络协议、SQL功能及语法,以及生态工具(如PHPMyAdmin、Navicat、MySQL Workbench、mysqldump、Mydumper/Myloader)。MySQL 5.7 的客户端等均适用于分布式融合数据库HTAP。下面介绍分布式融合数据库HTAP与 MySQL 兼容性对比。
不支持的功能特性
- 存储过程与函数
- 触发器
- 事件
- 自定义函数
- 外键约束
- 全文语法与索引
- 空间类型的函数(即 GIS/GEOMETRY)、数据类型和索引
- 非 ascii、latin1、binary、utf8、utf8mb4、gbk 的字符集
- SYS schema
- MySQL 追踪优化器
- XML 函数
- X-Protocol
- 列级权限
- XA 语法
- CREATE TABLE tblName AS SELECT stmt 语法
- CHECK TABLE 语法
- CHECKSUM TABLE 语法
- REPAIR TABLE 语法
- OPTIMIZE TABLE 语法
- HANDLER 语句
- CREATE TABLESPACE 语句
- MySQL 复制协议
有差异的功能特性
自增 ID
- 自增列既能保证唯一,也能保证在单个计算节点中自增,使用 AUTO_INCREMENT MySQL兼容模式能保证多个计算节点中自增ID,但不保证自动分配的值的连续性。建议避免将缺省值和自定义值混用,以免出现 Duplicated Error 的错误信息。
- 可通过系统变量开启或者关闭允许移除列的 AUTO_INCREMENT 属性。删除列属性的语法是:ALTER TABLE MODIFY 或 ALTER TABLE CHANGE。
- 不支持添加列的 AUTO_INCREMENT 属性,移除该属性后不可恢复。
Performance schema
主要使用Prometheus 体系产品来存储及查询相关的性能监控指标,所以 Performance schema 部分表是空表。
查询计划
执行计划在输出格式、内容、权限设置方面与MySQL 有较大差别。
系统变量optimizer_switch 是只读的,对查询计划没有影响。
内建函数
支持常用的MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。
DDL 的限制
所有支持的DDL 变更操作都是在线执行的,且存在以下限制:
- 使用 ALTER TABLE 语句修改一个表的多个模式对象(如列、索引)时,不允许在多个更改中指定同一个模式对象。例如,ALTER TABLE t1 MODIFY COLUMN c1 INT, DROP COLUMN c1在两个更改中都指定了c1列,执行该语句会输出 Unsupported operate same column/index 的错误。
- 不支持使用单个 ALTER TABLE 语句同时修改多个特有的模式对象,包括TIFLASH REPLICA,SHARD_ROW_ID_BITS,AUTO_ID_CACHE 等。
- ALTER TABLE 不支持少部分类型的变更。比如,不支持从 DECIMAL 到 DATE 的变更。当遇到不支持的类型变更时,将会报 Unsupported modify column: type %d not match origin %d 的错误。
- ALGORITHM={INSTANT,INPLACE,COPY} 语法只作为一种指定,并不更改ALTER 算法。
- 不支持添加或删除 CLUSTERED 类型的主键。
- 不支持指定不同类型的索引 (HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,会解析并忽略这些索引。
- 分区表支持 HASH、RANGE、LIST 和 KEY 分区类型。KEY分区类型暂不支持分区字段列表为空的语句。对于不支持的分区类型,会报 Warning: Unsupported partition type %s, treat as normal table 错误,其中%s 为不支持的具体分区类型。
- Range、Range COLUMNS、List、List COLUMNS 分区表支持 ADD、DROP、TRUNCATE、REORGANIZE 操作,其他分区操作会被忽略。
- Hash 和 Key 分区表支持 ADD、COALESCE、TRUNCATE 操作,其他分区操作会被忽略。
- 不支持以下分区表语法:
- SUBPARTITION
- {CHECK|OPTIMIZE|REPAIR|IMPORT|DISCARD|REBUILD} PARTITION
SELECT 的限制
- 不支持 SELECT ... INTO @变量 语法。
- 不支持 SELECT ... GROUP BY ... WITH ROLLUP 语法。
- SELECT .. GROUP BY expr 的返回结果与 MySQL 5.7 不一致,MySQL 5.7 的结果等价于 GROUP BY expr ORDER BY expr。
视图
视图不可更新,不支持UPDATE、INSERT、DELETE 等写入操作。
临时表
分布式融合数据库HTAP的临时表分为本地临时表和全局临时表:
- 本地临时表的表定义和表内数据只对当前会话可见,适用于暂存会话内的中间数据。
- 全局临时表的表定义对整个集群可见,表内数据只对当前事务可见,适用于暂存事务内的中间数据。
本地临时表的语义与MySQL 临时表类似,但有以下方面不兼容:
- 本地临时表不支持 ALTER TABLE。
- 本地临时表忽略 ENGINE 表选项,始终在内存中暂存临时表数据,并且有内存限制。
- 当声明存储引擎为 MEMORY 时,本地临时表没有 MEMORY 存储引擎的限制。
- 当声明存储引擎为 INNODB 或 MYISAM 时,本地临时表忽略 InnoDB 临时表特有的系统变量。
- MySQL 不允许在同一条 SQL 中多次引用同一张临时表,而本地临时表没有该限制。
- MySQL 中用于显示临时表的 information_schema.INNODB_TEMP_TABLE_INFO 表在分布式融合数据库HTAP中不存在。
- 不支持MySQL内部临时表及相关系统变量。
存储引擎
- 仅在语法上兼容创建表时指定存储引擎,实际上会将元信息统一描述为 InnoDB 存储引擎。
SQL 模式
- 不支持兼容模式,例如:Oracle 和 PostgreSQL(会解析并忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。
- 不适用NO_DIR_IN_CREATE和NO_ENGINE_SUBSTITUTION。
默认设置
-
字符集:
- 分布式融合数据库HTAP默认:utf8mb4。
- MySQL 5.7 默认:latin1。
- MySQL 8.0 默认:utf8mb4。
-
排序规则:
- 分布式融合数据库HTAP中 utf8mb4 字符集默认:utf8mb4_bin。
- MySQL 5.7 中 utf8mb4 字符集默认:utf8mb4_general_ci。
- MySQL 8.0 中 utf8mb4 字符集默认:utf8mb4_0900_ai_ci。
-
SQL mode:
- 分布式融合数据库HTAP默认:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。
- MySQL 5.7 默认与分布式融合数据库HTAP相同。
- MySQL 8.0 默认 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION。
-
lower_case_table_names:
- 分布式融合数据库HTAP默认:2,且仅支持设置该值为
2
。 - MySQL 默认如下:
- Linux 系统中该值为 0。
- Windows 系统中该值为 1。
- macOS 系统中该值为 2。
- 分布式融合数据库HTAP默认:2,且仅支持设置该值为
-
explicit_defaults_for_timestamp:
- 分布式融合数据库HTAP默认:ON,且仅支持设置该值为 ON。
- MySQL 5.7 默认:OFF。
- MySQL 8.0 默认:ON。
时区
- 采用系统当前安装的所有时区规则进行计算(一般为 tzdata 包),不需要导入时区表数据就能使用所有时区名称,导入时区表数据不会修改计算规则。
- MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。
类型系统
- 不支持 FLOAT4/FLOAT8。
- 不支持 SQL_TSI_*(包括 SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE 和 SQL_TSI_SECOND,但不包括 SQL_TSI_YEAR)。
不支持MySQL 已弃用功能
- 指定浮点类型的精度。MySQL 8.0 已弃用,建议改用 DECIMAL 类型。
- ZEROFILL 属性。 MySQL 8.0 已弃用,建议在业务应用中填充数字值。