返回介绍

AUTO_RANDOM

发布于 2020-10-26 07:01:27 字数 2955 浏览 1147 评论 0 收藏 0

注意:

AUTO_RANDOM 属性已于 v4.0.3 版本成为正式功能。

使用场景

AUTO_RANDOM 用于解决大批量写数据入 TiDB 时因含有整型自增主键列的表而产生的热点问题。详情参阅 TiDB 高并发写入场景最佳实践

以下面语句建立的表为例:

create table t (a bigint primary key auto_increment, b varchar(255))

在以上语句所建的表上执行大量未指定主键值的 INSERT 语句,示例如下:

insert into t(b) values ('a'), ('b'), ('c')

如以上语句,由于未指定主键列的值(a 列),TiDB 会使用连续自增的行值作为行 ID,可能导致单个 TiKV 节点上产生写入热点,进而影响对外提供服务的性能。要避免这种写入热点,可以在执行建表语句时为 a 列指定 AUTO_RANDOM 属性而不是 AUTO_INCREMENT 属性。示例如下:

create table t (a bigint primary key auto_random, b varchar(255))

或者

create table t (a bigint auto_random, b varchar(255), primary key (a))

此时再执行形如 INSERT INTO t(b) values...INSERT 语句。

  • 隐式分配:如果该 INSERT 语句没有指定整型主键列(a 列)的值,或者指定为 NULL,TiDB 会为该列自动分配值。该值不保证自增,不保证连续,只保证唯一,避免了连续的行 ID 带来的热点问题。
  • 显式插入:如果该 INSERT 语句显式指定了整型主键列的值,和 AUTO_INCREMENT 属性类似,TiDB 会保存该值。注意,如果未在系统变量 @@sql_mode 中设置 NO_AUTO_VALUE_ON_ZERO, 即使显式指定整型主键列的值为 0,TiDB 也会为该列自动分配值。

注意:

从 v4.0.3 开始,要使用显式插入的功能,需要将系统变量 @@allow_auto_random_explicit_insert 的值设置为 1(默认值为 0)。默认不支持显式插入的具体原因请参考兼容性

TiDB 支持解析版本注释语法。示例如下:

create table t (a bigint primary key /*T![auto_rand] auto_random */)
create table t (a bigint primary key auto_random)

以上两个语句含义相同。

show create table 的结果中,AUTO_RANDOM 属性会被注释掉。注释会附带一个特性标识符,例如 /*T![auto_rand] auto_random */。其中 auto_rand 表示 AUTO_RANDOM 的特性标识符,只有实现了该标识符对应特性的 TiDB 版本才能够正常解析 SQL 语句片段。

该功能支持向前兼容,即降级兼容。没有实现对应特性的 TiDB 版本则会忽略表(带有上述注释)的 AUTO_RANDOM 属性,因此能够使用含有该属性的表。

使用限制

目前在 TiDB 中使用 AUTO_RANDOM 有以下限制:

  • 该属性必须指定在整数类型的主键列上,否则会报错。此外,当配置项 alter-primary-key 的值为 true 时,即使是整型主键列,也不支持使用 AUTO_RANDOM
  • 不支持使用 ALTER TABLE 来修改 AUTO_RANDOM 属性,包括添加或移除该属性。
  • 不支持修改含有 AUTO_RANDOM 属性的主键列的列类型。
  • 不支持与 AUTO_INCREMENT 同时指定在同一列上。
  • 不支持与列的默认值 DEFAULT 同时指定在同一列上。
  • 插入数据时,不建议自行显式指定含有 AUTO_RANDOM 列的值。不恰当地显式赋值,可能会导致该表提前耗尽用于自动分配的数值。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文