MySQL 兼容性

最近更新时间:2026-05-12 16:49:23

我的收藏
TDSQL Boundless 高度兼容 MySQL 8.0 协议。MySQL 生态中的系统工具(phpMyAdmin、Navicat、MySQL Workbench、DBeaver 等)、客户端等均适用于 TDSQL Boundless。

不支持的功能

禁止在系统库 mysql 下执行 DDL
生成列(Generated column)
事件(Event)
表空间(Tablespace),也包括可传输表空间(Transportable tablespace)
资源组(Resource group)
外键(Foreign keys)
LOB 数据类型的部分更新(Partial Update of LOB in InnoDB)
JSON 数据类型的多值索引(Multi-valued indexes)
空间类型的函数(GEOMETRY/GIS) 、数据类型和索引
全文语法与索引(Fulltext indexes)
降序索引(Descending indexes)
REPAIR TABLE 语法
交换分区(ALTER TABLE ... EXCHANGE PARTITION)
SKIP LOCKED 语法
XA 相关的语法返回成功但是不生效
组复制(Group Replication)
X 协议(X Protocol)

与 MySQL 有差异的功能特性

自增列

TDSQL Boundless 提供了高性能模式和 MySQL 兼容模式的自增 ID:
高性能模式:此模式通过在每个对等节点上缓存一批自增 ID 值来提升性能,它能保证自增值全局唯一,但不保证自增值在所有节点间连续递增。缓存的批量大小受参数 tdsql_auto_increment_batch_size 控制,默认值为100。
MySQL 兼容模式:设置系统参数 tdsql_auto_increment_batch_size 为1,可保证自增值全局唯一且递增。
警告:
为防止 AUTO_INCREMENT 列出现值重复,必须将其定义为独立的主键或唯一索引。如果它只是复合主键的一部分,那么用户手动插入的 ID 就可能与系统生成的 ID 冲突。为避免数据冲突,请始终将自增列定义为独立的主键或唯一索引。
与 MySQL 不同,TDSQL Boundless 的自增列在特定情况下可能出现值重复。当自增列不是主键或者唯一索引时(例如,自增列只是复合主键的一部分),TDSQL Boundless 无法保证其值的唯一性。这个问题会在用户手动插入的自增值与系统自动生成的值相同时出现。例如,创建一张测试表 t1,其中自增列 idf1 组合成复合主键:
CREATE TABLE `t1` (
`id` int NOT NULL AUTO_INCREMENT,
`f1` int NOT NULL,
`f2` int DEFAULT NULL,
PRIMARY KEY (`id`,`f1`)
) DEFAULT CHARSET=utf8mb4;
此时,在节点一上执行操作写入数据,自动生成 id = 1 的数据:
-- 使用系统生成的自增
insert into t1(f1, f2) values(1,1);
在节点二上手动指定 id = 1,并执行写入提交:
-- 用户主动指定了自增
insert into t1(id, f1, f2) values(1, 1,1);
可能会导致最终 id 的值出现重复,因此在定义自增列的时候,尽量将自增列定义为独立的主键/唯一索引。

存储引擎

TDSQL Boundless 仅支持创建与使用 RocksDB 存储引擎的表,且不允许修改表引擎。无论用户建表的时候指定的存储引擎是什么,TDSQL 都会转换成 RocksDB 引擎。
说明:
Blackhole 引擎除外。

字符集与排序规则

说明:
官方 MySQL 从8.0.29版本开始,原有默认 UTF8 编码格式变为 utf8mb4。
TDSQL Boundless 沿用 MySQL 8.0.29之前版本的默认字符集 utf8mb3(即 UTF8)。为提升应用的兼容性和可移植性,建议在 TDSQL Boundless 中创建表和建立数据库连接时,显式指定使用字符集编码。
对比项
TDSQL Boundless
MySQL 8.0.29以下版本
MySQL 8.0.29及以上版本
默认字符集
utf8mb3
utf8mb3
utf8mb4
默认排序规则
utf8_general_ci
utf8_general_ci
utf8mb4_0900_ai_ci

SQL 广播

TDSQL Boundless 可通过设置 /*# broadcast */ SQL Hints 将查询广播到实例的所有节点。例如,
SET GLOBAL 只会设置某个节点上的变量;用/*# broadcast */ SET GLOBAL 可广播到所有节点能使其在全局生效。
SHOW PROCESSLIST 展示当前连接节点的 processlist,如果需要展示所有节点的,需要用 /*# broadcast */SHOW PROCESSLIST;SELECT * FROM information_schema.processlist

日志输出

TDSQL Boundless 中,通用日志 general_log 和慢查询日志 slow_log 仅支持输出到文件,暂不支持通过 SET GLOBAL log_output=TABLE 设置为输出到表。

DDL 差异

相比 MySQL,TDSQL Boundless 支持了更多常用的 Online DDL 操作,支持在线变更列类型、字符集/排序规则、非分区表与分区表互转。但与 MySQL 不同,不那么常用的 DDL 操作,对于增/删主键、添加带表达式默认值的列(ADD COLUMN DEFAULT (a+a))、涉及触发器的表等操作,TDSQL Boundless 不支持在线执行。若执行这类 DDL 时遇到报错,请先通过 set tdsql_use_online_copy_ddl = 0 关闭 Online DDL 模式,再重新执行。
更详细的差异可参考 Online DDL 说明
说明:
若执行增/删主键、添加带表达式默认值的列(ADD COLUMN DEFAULT (a+a))、涉及触发器的表等操作报错,可通过 set tdsql_use_online_copy_ddl = 0 关闭 Online DDL 模式,再重新执行。注意,关闭 Online DDL 模式会导致 DDL 锁表且执行期间阻塞该表的写入。

INSERT ON DUPLICATE KEY UPDATE 并发场景加锁差异

说明:
强烈建议通过INSERT ... ON DUPLICATE KEY UPDATE 语句更新数据时,采用统一的写法,统一不指定主键,确保所有事务的加锁顺序一致。
MySQL InnoDB 执行 INSERT ... ON DUPLICATE KEY UPDATE 语句时,检测到主键冲突后立即转入执行 UPDATE 操作,不再对表上的唯一索引加锁来验证唯一索引的约束。
而 TDSQL Boundless 为提升写入性能,默认开启批量写入优化机制(tdsql_stmt_optim_batch_upsert = ON)。该机制在检测到主键冲突后,仍会继续对表的唯一索引加锁验证唯一性。当并发的 SQL 写法不统一、加锁顺序相反时,可能导致死锁。
需同时满足以下限制时才会触发死锁:
表中同时存在主键和唯一索引
多条 INSERT ... ON DUPLICATE KEY UPDATE 语句并发操作同一条记录
SQL 写法混用(部分语句指定主键 PK 写入,部分语句不指定主键 PK 写入)
例如,创建一张测试表 t1,其中 uk_col 字段上有唯一索引:
CREATE TABLE t1 (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
uk_col INT NOT NULL,
col VARCHAR(255),
UNIQUE KEY idx_uk (uk_col)
) DEFAULT CHARSET=utf8mb4;
INSERT INTO t1 VALUES (100, 100, 'init');
并发写入时,事务 A 带着主键 id 字段更新时,发现主键冲突,先锁主键,再锁唯一键;而事务 B 不带主键字段更新,先锁唯一键,再锁主键,导致可能出现死锁:
-- 事务 A:带主键 id → 先锁主键,再锁唯一键
INSERT INTO t1 (id, uk_col, col) VALUES (100, 100, 'session a') ON DUPLICATE KEY UPDATE;

-- 事务 B:不带主键 id → 先锁唯一键,再定位主键
INSERT INTO t1 (uk_col, col) VALUES (100, 'session b') ON DUPLICATE KEY UPDATE;

-- 事务 A 与事务 B 高并发执行 → 可能死锁
解决方案
统一 SQL 写法(推荐):确保所有 INSERT ... ON DUPLICATE KEY UPDATE 语句统一不传主键字段,使所有事务走相同的加锁顺序;避免混用带主键和不带主键的写法。
关闭 BATCH 写入优化:设置系统参数 tdsql_stmt_optim_batch_upsertOFF ,回退到逐一检查模式,主键冲突时提前终止,不再继续对二级索引加锁,行为和 MySQL InnoDB 保持一致。
注意:
关闭系统参数 tdsql_stmt_optim_batch_upsert 可能影响多索引场景下的批量写入性能,建议评估业务负载后再操作。
修改后仅对新建连接生效,需重新初始化连接池。

其他

SHOW VARIABLES;SHOW GLOBAL STATUS; 展示的是当前连接的计算节点中的状态信息,连到不同的计算节点展示的信息可能不同。
LOCK TABLE 相关的语句不会锁表阻塞业务读写,因此,部分依赖于 LOCK TABLE 的操作可能受限,例如,mysqldumper 导出工具。

灰度特性

下述功能在当前版本为灰度特性,请根据说明在一定条件下使用。
说明:
每个灰度特性各自拥有独立开关和默认值。用户如需开启/关闭,请在连接到 TDSQL Boundless 实例后通过如下 SQL 语句开启(以 tdsql_enable_trigger 为例):SET PERSIST tdsql_enable_trigger=ON;
特性名
开关
默认值
说明
触发器
tdsql_enable_trigger
OFF
不建议使用
视图
tdsql_enable_view
ON
不建议在视图上执行更新操作
不建议 ALTER 变更视图定义
存储过程
tdsql_enable_procedure
ON
不建议 ALTER 变更存储过程定义
函数
tdsql_enable_function
ON
不建议 ALTER 变更 FUNCTION