与 MySQL 兼容性对比
TiDB 高度兼容 MySQL 协议,以及 MySQL 5.7 和 MySQL 8.0 常用的功能及语法。MySQL 生态中的系统工具(PHPMyAdmin、Navicat、MySQL Workbench、DBeaver 和 其他工具 )、客户端等均适用于 TiDB。
但 TiDB 尚未支持一些 MySQL 功能,可能的原因如下:
- 有更好的解决方案,例如 JSON 取代 XML 函数。
- 目前对这些功能的需求度不高,例如存储过程和函数。
- 一些功能在分布式系统上的实现难度较大。
除此以外,TiDB 不支持 MySQL 复制协议,但提供了专用工具用于与 MySQL 复制数据:
- 从 MySQL 复制: TiDB Data Migration (DM) 是将 MySQL/MariaDB 数据迁移到 TiDB 的工具,可用于增量数据的复制。
- 向 MySQL 复制: TiCDC 是一款通过拉取 TiKV 变更日志实现的 TiDB 增量数据同步工具,可通过 MySQL sink 将 TiDB 增量数据复制到 MySQL。
不支持的功能特性
- 存储过程与函数
- 触发器
- 事件
- 自定义函数
- 全文语法与索引 #1793
-
空间类型的函数(即
GIS/GEOMETRY)、数据类型和索引 #6347 -
非
ascii、latin1、binary、utf8、utf8mb4、gbk的字符集 - MySQL 追踪优化器
- XML 函数
- X-Protocol #1109
- 列级权限 #9766
-
XA语法(TiDB 内部使用两阶段提交,但并没有通过 SQL 接口公开) -
CREATE TABLE tblName AS SELECT stmt语法 #4754 -
CHECK TABLE语法 #4673 -
CHECKSUM TABLE语法 #1895 -
REPAIR TABLE语法 -
OPTIMIZE TABLE语法 -
HANDLER语句 -
CREATE TABLESPACE语句 - "Session Tracker: 将 GTID 上下文信息添加到 OK 包中"
- 降序索引 #2519
-
SKIP LOCKED语法 #18207 - 横向派生表 #40328
- JOIN 的 ON 子句的子查询 #11414
与 MySQL 有差异的特性详细说明
自增 ID
-
TiDB 的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,使用
AUTO_INCREMENT兼容 MySQL 的自增列模式 能保证多个 TiDB server 中自增 ID,但不保证自动分配的值的连续性。建议避免将缺省值和自定义值混用,以免出现Duplicated Error的错误。 -
TiDB 可通过
tidb_allow_remove_auto_inc系统变量开启或者关闭允许移除列的AUTO_INCREMENT属性。删除列属性的语法是:ALTER TABLE MODIFY或ALTER TABLE CHANGE。 -
TiDB 不支持添加列的
AUTO_INCREMENT属性,移除该属性后不可恢复。 -
对于 v6.6.0 及更早的 TiDB 版本,TiDB 的自增列行为与 MySQL InnoDB 保持一致,要求自增列必须为主键或者索引前缀。从 v7.0.0 开始,TiDB 移除了该限制,允许用户更灵活地定义表的主键。关于此更改的详细信息,请参阅 #40580
自增 ID 详情可参阅 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 |
+-------------+------+