TDSQL Boundless 高度兼容 MySQL 8.0协议。MySQL 生态中的系统工具(phpMyAdmin、Navicat、MySQL Workbench、DBeaver 等)、客户端等均适用于 TDSQL Boundless。
不支持的功能
禁止在系统库
mysql 下执行 DDL事件(Event)
表空间(Tablespace),也包括可传输表空间(Transportable tablespace)
资源组(Resource group)
外键(Foreign keys)
LOB 数据类型的部分更新(Partial Update of LOB in InnoDB)
空间类型的函数(
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,其中自增列 id 与 f1 组合成复合主键: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 可广播到所有节点能使其在全局生效。自 V21.6.4.0 版本起,
SHOW PROCESSLIST 默认即聚合返回所有计算节点的会话信息,无需额外加 /*# broadcast */ hint。SHOW FULL PROCESSLIST 会在结果末尾追加 Endpoint 列(IP:Port),标注每行所属的计算节点。如仅需查看当前连接节点的会话信息,请使用 SHOW LOCAL PROCESSLIST。information_schema.PROCESSLIST 系统视图同步新增 ENDPOINT 列。V21.6.3.0 及以下版本,
SHOW 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 模式,再重新执行。说明:
若执行删主键、添加带表达式默认值的列(
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_upsert 为 OFF ,回退到逐一检查模式,主键冲突时提前终止,不再继续对二级索引加锁,行为和 MySQL InnoDB 保持一致。注意:
关闭系统参数
tdsql_stmt_optim_batch_upsert 可能影响多索引场景下的批量写入性能,建议评估业务负载后再操作。修改后仅对新建连接生效,需重新初始化连接池。
生成列(Generated Column)
TDSQL Boundless 在 RocksDB 引擎上支持虚拟生成列(VIRTUAL Generated Column)和存储生成列(STORED Generated Column)。
虚拟生成列不占用存储空间,其值在读取时根据表达式动态计算,可对其建立索引以加速查询。存储生成列的值在写入时根据表达式计算并持久化到磁盘,会占用存储空间,同样可对其建立索引加速查询。
JSON 多值索引(Multi-Valued Index)
TDSQL Boundless 在 RocksDB 引擎上支持基于 JSON 类型的多值索引(Multi-Valued Index,MVI),使用
CAST(... AS type ARRAY) 定义索引字段,可高效检索 JSON 数组中的元素。注意:
多值索引存在以下使用限制:
必须基于 VIRTUAL 生成列(通过
CAST(... AS type ARRAY) 定义)不支持与全局二级索引(GSI)组合使用,建表时会报错
ER_GLOBAL_INDEX_UNSUPPORTED不支持索引条件下推(ICP)
不支持 COUNT 下推优化
其他
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 |