AUTO_INCREMENT
StarRocks 自 3.0 版本起支持 AUTO_INCREMENT
列属性,可以简化数据管理。本文介绍 AUTO_INCREMENT
列属性的应用场景、用法和特性。
功能介绍
当插入一条新的记录时,StarRocks 会自动为该记录的自增列分配一个表内全局唯一的整数值作为自增 ID,并且后续值会自动增加。自增列可以简化数据管理,同时可以加速一些查询场景。以下是一些自增列的应用场景:
- 主键:自增列可用于生成主键,确保每条记录都有一个唯一的标识符,方便查询和管理数据。
- 关联表:在多个表之间进行关联时,可以使用自增列作为 Join Key,相比使用如 UUID 等字符串类型的列能够提高查询速度。
- 高基数列的精确去重计数:将自增列的 ID 值作为字典唯一值列,相比用字符串直接精确去重计数,查询速度能提升数倍甚至十数倍。
您需要在 CREATE TABLE 语句中通过 AUTO_INCREMENT
属性指定自增列。自增列的数据类型只支持 BIGINT,从 1 开始增加,自增步长为 1。 并且 StarRocks 支持隐式分配自增列的值和显式指定自增 ID。
基本用法
建表指定自增列
创建表 test_tbl1
,包含两列,分别为 id
和 number
,如下所示,建表时指定 number
列为自增列:
CREATE TABLE test_tbl1
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
分配自增列的值
隐式分配自增列的值
导入时,您无需指定自增列的值,StarRocks 会自动为该自增列分配唯一的整数值,并插入到表中。
INSERT INTO test_tbl1 (id) VALUES (1);
INSERT INTO test_tbl1 (id) VALUES (2);
INSERT INTO test_tbl1 (id) VALUES (3),(4),(5);
查看表的数据。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
+------+--------+
5 rows in set (0.02 sec)
您也可以指定自增列的值为 DEFAULT
,StarRocks 会自动为该自增列分配唯一的整数值,并插入到表中。
INSERT INTO test_tbl1 (id, number) VALUES (6, DEFAULT);
查看表的数据。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 6 | 6 |
+------+--------+
6 rows in set (0.02 sec)
在实际使用中,您查看表的数据时可能会返回如下结果。这是因为 StarRocks 无法保证自增列的值按照时间顺序严格递增,但是能保证自增列的值大致上是递增的。更多介绍,请参见单调性保证。
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
+------+--------+
6 rows in set (0.01 sec)
显式指定自增列的值
您也可以显式地指定自增列的值,并插入到表中。
INSERT INTO test_tbl1 (id, number) VALUES (7, 100);
-- 查看表的数据
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
+------+--------+
7 rows in set (0.01 sec)
并且,后续插入新数据时不会影响 StarRocks 新生成的自增列的值。
INSERT INTO test_tbl1 (id) VALUES (8);
-- 查看表的数据
mysql > SELECT * FROM test_tbl1 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 100001 |
| 3 | 200001 |
| 4 | 200002 |
| 5 | 200003 |
| 6 | 200004 |
| 7 | 100 |
| 8 | 2 |
+------+--------+
8 rows in set (0.01 sec)
注意事项
因为同时隐式分配和显式指定自增 ID 可能会破坏自增 ID 的全局唯一性,建议您不要混用。
基本特性
唯一性保证
在一般情况下,StarRocks 保证自增 ID 在一张表内是全局唯一的。
但是,如果您混用隐式分配和显式指定自增 ID,则可能会破坏自增 ID 的全局唯一性。因此建议您不要同时隐式分配和显式指定自增 ID。以下是一个简单的示例:
创建表 test_tbl2
,其中列 number
为自增列。
CREATE TABLE test_tbl2
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
往表 test_tbl2
中同时隐式分配和显式指定自增 ID。
INSERT INTO test_tbl2 (id, number) VALUES (1, DEFAULT);
INSERT INTO test_tbl2 (id, number) VALUES (2, 2);
INSERT INTO test_tbl2 (id) VALUES (3);
查询表 test_tbl2
的数据。
mysql > SELECT * FROM test_tbl2 ORDER BY id;
+------+--------+
| id | number |
+------+--------+
| 1 | 1 |
| 2 | 2 |
| 3 | 100001 |
+------+--------+
3 rows in set (0.08 sec)
单调性保证
为了提升分配自增 ID 的性能,BE 会本地缓存部分自增 ID。在这种情况下,StarRocks 无法保证自增 ID 按照时间顺序严格递增,只能保证自增 ID 大致上是递增的。
说明
BE 缓存的自增 ID 数量由 FE 动态参数
auto_increment_cache_size
决定,默认是100000
。您可以使用ADMIN SET FRONTEND CONFIG ("auto_increment_cache_size" = "xxx");
进行修改 。 假设 StarRocks 集群具有一个 FE 节点和两个 BE 节点。创建表test_tbl3
并且插入五行数据,如下所示:
CREATE TABLE test_tbl3
(
id BIGINT NOT NULL,
number BIGINT NOT NULL AUTO_INCREMENT
)
PRIMARY KEY (id)
DISTRIBUTED BY HASH(id)
PROPERTIES("replicated_storage" = "true");
INSERT INTO test_tbl3 VALUES (1, DEFAULT);
INSERT INTO test_tbl3 VALUES (2, DEFAULT);
INSERT INTO test_tbl3 VALUES (3, DEFAULT);
INSERT INTO test_tbl3 VALUES (4, DEFAULT);
INSERT INTO test_tbl3 VALUES (5, DEFAULT);