与 MySQL 兼容性对比
平凯数据库高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能及语法。MySQL 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver 和其他工具)、客户端等均适用于平凯数据库。
但平凯数据库尚未支持一些 MySQL 功能,可能的原因如下:
- 有更好的解决方案,例如 JSON 取代 XML 函数。
- 目前对这些功能的需求度不高,例如存储过程和函数。
- 一些功能在分布式系统上的实现难度较大。
除此以外,平凯数据库不支持 MySQL 复制协议,但提供了专用工具用于与 MySQL 复制数据:
- 从 MySQL 复制:TiDB Data Migration (DM) 是将 MySQL/MariaDB 数据迁移到平凯数据库的工具,可用于增量数据的复制。
- 向 MySQL 复制:TiCDC 是一款通过拉取 TiKV 变更日志实现的平凯数据库增量数据同步工具,可通过 MySQL sink 将平凯数据库增量数据复制到 MySQL。
不支持的功能特性
- 存储过程与函数
- 触发器
- 事件
- 自定义函数
- 全文语法与索引
- 空间类型的函数(即
GIS/GEOMETRY)、数据类型和索引 - 非
ascii、latin1、binary、utf8、utf8mb4、gbk的字符集 - MySQL 追踪优化器
- XML 函数
- X-Protocol
- 列级权限
XA语法(平凯数据库内部使用两阶段提交,但并没有通过 SQL 接口公开)CREATE TABLE tblName AS SELECT stmt语法CHECK TABLE语法CHECKSUM TABLE语法REPAIR TABLE语法OPTIMIZE TABLE语法HANDLER语句CREATE TABLESPACE语句- "Session Tracker: 将 GTID 上下文信息添加到 OK 包中"
- 降序索引
SKIP LOCKED语法- 横向派生表
与 MySQL 有差异的特性详细说明
自增 ID
平凯数据库的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,使用
AUTO_INCREMENTMySQL 兼容模式能保证多个 TiDB server 中自增 ID,但不保证自动分配的值的连续性。建议避免将缺省值和自定义值混用,以免出现Duplicated Error的错误。平凯数据库可通过
tidb_allow_remove_auto_inc系统变量开启或者关闭允许移除列的AUTO_INCREMENT属性。删除列属性的语法是:ALTER TABLE MODIFY或ALTER TABLE CHANGE。平凯数据库不支持添加列的
AUTO_INCREMENT属性,移除该属性后不可恢复。
mysql> CREATE TABLE t(id INT UNIQUE KEY AUTO_INCREMENT);
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)
mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)
mysql> INSERT INTO t VALUES();
Query OK, 1 rows affected (0.00 sec)
mysql> SELECT _tidb_rowid, id FROM t;
+-------------+------+
| _tidb_rowid | id |
+-------------+------+
| 2 | 1 |
| 4 | 3 |
| 6 | 5 |
+-------------+------+
3 rows in set (0.01 sec)
可以看到,由于共用分配器,id 每次自增步长是 2。在 MySQL 兼容模式中改掉了该行为,没有共用分配器,因此不会跳号。
Performance schema
平凯数据库主要使用 Prometheus 和 Grafana 来存储及查询相关的性能监控指标。因此,平凯数据库的 Performance schema 表返回空结果。
查询计划
平凯数据库中,执行计划(EXPLAIN 和 EXPLAIN FOR)在输出格式、内容、权限设置方面与 MySQL 有较大差别。
MySQL 系统变量 optimizer_switch 在平凯数据库中是只读的,对查询计划没有影响。你还可以在 optimizer hints 中使用与 MySQL 类似的语法,但可用的 hint 和实现原理可能会有所不同。
详情参见理解平凯数据库执行计划。
内建函数
支持常用的 MySQL 内建函数,有部分函数并未支持。可通过执行 SHOW BUILTINS 语句查看可用的内建函数。
DDL 的限制
平凯数据库中,所有支持的 DDL 变更操作都是在线执行的。与 MySQL 相比,平凯数据库中的 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的错误。更多细节,请参考ALTER TABLE。平凯数据库中,
ALGORITHM={INSTANT,INPLACE,COPY}语法只作为一种指定,并不更改ALTER算法,详情参阅ALTER TABLE。不支持添加或删除
CLUSTERED类型的主键。要了解关于CLUSTERED主键的详细信息,请参考聚簇索引。不支持指定不同类型的索引 (
HASH|BTREE|RTREE|FULLTEXT)。若指定了不同类型的索引,平凯数据库会解析并忽略这些索引。分区表支持
HASH、RANGE、LIST和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
更多详情,请参考分区表文档。
ANALYZE TABLE
平凯数据库中的信息统计与 MySQL 中的有所不同:平凯数据库中的信息统计会完全重构表的统计数据,语句消耗较多资源,执行过程较长,但在 MySQL/InnoDB 中,它是一个轻量级语句,执行过程较短。
更多信息统计的差异请参阅 ANALYZE TABLE。
SELECT 的限制
平凯数据库的 SELECT 语法有以下限制:
- 不支持
SELECT ... INTO @变量语法。 - 平凯数据库中的
SELECT .. GROUP BY expr的返回结果与 MySQL 5.7 并不一致。MySQL 5.7 的结果等价于GROUP BY expr ORDER BY expr。
详情参见 SELECT。
UPDATE 语句
详情参见 UPDATE。
视图
平凯数据库中的视图不可更新,不支持 UPDATE、INSERT、DELETE 等写入操作。
临时表
字符集和排序规则
存储引擎
- 仅在语法上兼容创建表时指定存储引擎,实际上平凯数据库会将元信息统一描述为 InnoDB 存储引擎。平凯数据库支持类似 MySQL 的存储引擎抽象,但需要在系统启动时通过
--store配置项来指定存储引擎。
SQL 模式
平凯数据库支持大部分 SQL 模式。不支持的 SQL 模式如下:
- 不支持兼容模式,例如:
Oracle和PostgreSQL(平凯数据库解析但会忽略这两个兼容模式),MySQL 5.7 已弃用兼容模式,MySQL 8.0 已移除兼容模式。 - 平凯数据库的
ONLY_FULL_GROUP_BY模式与 MySQL 5.7 相比有细微的语义差别。 NO_DIR_IN_CREATE和NO_ENGINE_SUBSTITUTION仅用于解决与 MySQL 的兼容性问题,并不适用于平凯数据库。
默认设置
平凯数据库的默认设置与 MySQL 5.7 和 MySQL 8.0 有以下区别:
字符集:
- 平凯数据库默认:
utf8mb4。 - MySQL 5.7 默认:
latin1。 - MySQL 8.0 默认:
utf8mb4。
- 平凯数据库默认:
排序规则:
- 平凯数据库中
utf8mb4字符集默认:utf8mb4_bin。 - MySQL 5.7 中
utf8mb4字符集默认:utf8mb4_general_ci。 - MySQL 8.0 中
utf8mb4字符集默认:utf8mb4_0900_ai_ci。
- 平凯数据库中
SQL mode:
- 平凯数据库默认:
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 默认与平凯数据库相同。
- 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:- 平凯数据库默认:
2,且仅支持设置该值为2。 - MySQL 默认如下:
- Linux 系统中该值为
0,表示表名和数据库名按照在CREATE TABLE或CREATE DATABASE语句中指定的字母大小写存储在磁盘上,且名称比较时区分大小写。 - Windows 系统中该值为
1,表示表名按照小写字母存储在磁盘上,名称比较时不区分大小写。MySQL 在存储和查询时将所有表名转换为小写。该行为也适用于数据库名称和表的别名。 - macOS 系统中该值为
2,表示表名和数据库名按照在CREATE TABLE或CREATE DATABASE语句中指定的字母大小写存储在磁盘上,但 MySQL 在查询时将它们转换为小写。名称比较时不区分大小写。
- Linux 系统中该值为
- 平凯数据库默认:
explicit_defaults_for_timestamp:- 平凯数据库默认:
ON,且仅支持设置该值为ON。 - MySQL 5.7 默认:
OFF。 - MySQL 8.0 默认:
ON。
- 平凯数据库默认:
日期时间处理的区别
平凯数据库与 MySQL 在日期时间处理上有如下差异:
平凯数据库采用系统当前安装的所有时区规则进行计算(一般为
tzdata包),不需要导入时区表数据就能使用所有时区名称,导入时区表数据不会修改计算规则。MySQL 默认使用本地时区,依赖于系统内置的当前的时区规则(例如什么时候开始夏令时等)进行计算;且在未导入时区表数据的情况下不能通过时区名称来指定时区。
类型系统
MySQL 支持 SQL_TSI_*(包括 SQL_TSI_MONTH、SQL_TSI_WEEK、SQL_TSI_DAY、SQL_TSI_HOUR、SQL_TSI_MINUTE 和 SQL_TSI_SECOND,但不包括 SQL_TSI_YEAR),但平凯数据库不支持。
正则函数
关于平凯数据库中正则函数 REGEXP_INSTR()、REGEXP_LIKE()、REGEXP_REPLACE()、REGEXP_SUBSTR() 与 MySQL 的兼容情况,请参考正则函数与 MySQL 的兼容性。
MySQL 弃用功能导致的不兼容问题
平凯数据库不支持 MySQL 中标记为弃用的功能,包括:
CREATE RESOURCE GROUP,DROP RESOURCE GROUP 和 ALTER RESOURCE GROUP
平凯数据库资源组创建与修改语句的语法与 MySQL 官方不同,详情参见: