diff --git a/auto-increment.md b/auto-increment.md index 534592342ec6..30805817fe87 100644 --- a/auto-increment.md +++ b/auto-increment.md @@ -18,6 +18,10 @@ aliases: ['/docs-cn/dev/auto-increment/'] 出于性能原因,自增编号是系统批量分配给每台 TiDB 服务器的值(默认 3 万个值),因此自增编号能保证唯一性,但分配给 `INSERT` 语句的值仅在单台 TiDB 服务器上具有单调性。 +> **注意:** +> +> 如果要求自增编号在所有 TiDB 实例上具有单调性,并且你的 TiDB 版本在 v6.4.0 及以上,你可以使用 v6.4.0 引入的实验特性 [MySQL 兼容模式](#mysql-兼容模式)。 + {{< copyable "sql" >}} ```sql @@ -322,6 +326,31 @@ SELECT * FROM t; 从 v3.0.9 和 v4.0.rc-1 开始,和 MySQL 的行为类似,自增列隐式分配的值遵循 session 变量 `@@auto_increment_increment` 和 `@@auto_increment_offset` 的控制,其中自增列隐式分配的值 (ID) 将满足式子 `(ID - auto_increment_offset) % auto_increment_increment == 0`。 +## MySQL 兼容模式 + +从 v6.4.0 开始,TiDB 实现了中心化分配自增 ID 的服务,可以支持 TiDB 实例不缓存数据,而是每次请求都访问中心化服务获取 ID。 + +> **警告:** +> +> 当前该功能为实验特性,不建议在生产环境中使用。 + +当前中心化分配服务内置在 TiDB 进程,类似于 DDL Owner 的工作模式。有一个 TiDB 实例将充当“主”的角色提供 ID 分配服务,而其它的 TiDB 实例将充当“备”角色。当“主”节点发生故障时,会自动进行“主备切换”,从而保证中心化服务的高可用。 + +MySQL 兼容模式的使用方式是,建表时将 `AUTO_ID_CACHE` 设置为 `1`: + +```sql +CREATE TABLE t(a int AUTO_INCREMENT key) AUTO_ID_CACHE 1; +``` + +> **注意:** +> +> 在 TiDB 各个版本中,`AUTO_ID_CACHE` 设置为 `1` 都表明 TiDB 不再缓存 ID,但是不同版本的实现方式不一样: +> +> - 对于 TiDB v6.4.0 之前的版本,由于每次分配 ID 都需要通过一个 TiKV 事务完成 `AUTO_INCREMENT` 值的持久化修改,因此设置 `AUTO_ID_CACHE` 为 `1` 会出现性能下降。 +> - 对于 v6.4.0 及以上版本,由于引入了中心化的分配服务,`AUTO_INCREMENT` 值的修改只是在 TiDB 服务进程中的一个内存操作,相较于之前版本更快。 + +使用 MySQL 兼容模式后,能保证 ID **唯一**、**单调递增**,行为几乎跟 MySQL 完全一致。即使跨 TiDB 实例访问,ID 也不会出现回退。只有当中心化服务的“主” TiDB 实例异常崩溃时,才有可能造成少量 ID 不连续。这是因为主备切换时,“备” 节点需要丢弃一部分之前的“主” 节点可能已经分配的 ID,以保证 ID 不出现重复。 + ## 使用限制 目前在 TiDB 中使用 `AUTO_INCREMENT` 有以下限制: diff --git a/experimental-features.md b/experimental-features.md index 470faa59693c..9d7e1c674af4 100644 --- a/experimental-features.md +++ b/experimental-features.md @@ -38,6 +38,7 @@ aliases: ['/docs-cn/dev/experimental-features-4.0/','/zh/tidb/dev/experimental-f + [元数据锁](/metadata-lock.md)(v6.3.0 实验特性) + [Range INTERVAL 分区](/partitioned-table.md#range-interval-分区)(v6.3.0 实验特性) + [添加索引加速](/system-variables.md#tidb_ddl_enable_fast_reorg-从-v630-版本开始引入)(v6.3.0 实验特性) ++ [`AUTO_INCREMENT` MySQL 兼容模式](/auto-increment.md#mysql-兼容模式)(v6.4.0 实验特性) + [将集群的数据恢复到特定的时间点 `FLASHBACK CLUSTER TO TIMESTAMP`](/sql-statements/sql-statement-flashback-to-timestamp.md)。(v6.4.0 实验特性) ## 存储 diff --git a/mysql-compatibility.md b/mysql-compatibility.md index a89b6b011d71..355ffdb4fa9c 100644 --- a/mysql-compatibility.md +++ b/mysql-compatibility.md @@ -49,7 +49,7 @@ aliases: ['/docs-cn/dev/mysql-compatibility/','/docs-cn/dev/reference/mysql-comp ### 自增 ID -- TiDB 的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,但不保证多个 TiDB server 中自增,不保证自动分配的值的连续性。不建议将缺省值和自定义值混用,若混用可能会收到 `Duplicated Error` 的错误信息。 +- TiDB 的自增列既能保证唯一,也能保证在单个 TiDB server 中自增,使用 [`AUTO_INCREMENT` MySQL 兼容模式](/auto-increment.md#mysql-兼容模式)能保证多个 TiDB server 中自增 ID,但不保证自动分配的值的连续性。不建议将缺省值和自定义值混用,若混用可能会收到 `Duplicated Error` 的错误信息。 - TiDB 可通过 `tidb_allow_remove_auto_inc` 系统变量开启或者关闭允许移除列的 `AUTO_INCREMENT` 属性。删除列属性的语法是:`ALTER TABLE MODIFY` 或 `ALTER TABLE CHANGE`。