AUTO_RANDOMNew in v3.1.0
User scenario
Since the value ofAUTO_RANDOM
is random and unique,AUTO_RANDOM
is often used in place ofAUTO_INCREMENT
to avoid write hotspot in a single storage node caused by TiDB assigning consecutive IDs. If the currentAUTO_INCREMENT
column is a primary key and the type isBIGINT
, you can execute theALTER TABLE t MODIFY COLUMN id BIGINT AUTO_RANDOM(5);
statement to switch fromAUTO_INCREMENT
toAUTO_RANDOM
.
For more information about how to handle highly concurrent write-heavy workloads in TiDB, seeHighly concurrent write best practices.
TheAUTO_RANDOM_BASE
parameter in the创建TABLEstatement is used to set the initial incremental part value ofauto_random
. This option can be considered as a part of the internal interface. You can ignore this parameter.
Basic concepts
AUTO_RANDOM
is a column attribute that is used to automatically assign values to aBIGINT
column. Values assigned automatically arerandomandunique.
To create a table with anAUTO_RANDOM
column, you can use the following statements. TheAUTO_RANDOM
column must be included in a primary key, and theAUTO_RANDOM
column is the first column in the primary key.
创建
TABLEt (aBIGINTAUTO_RANDOM, bVARCHAR(255),PRIMARYKEY (a));创建
TABLEt (aBIGINT
PRIMARYKEY AUTO_RANDOM, bVARCHAR(255));创建
TABLEt (aBIGINTAUTO_RANDOM(6), bVARCHAR(255),PRIMARYKEY (a));创建
TABLEt (aBIGINTAUTO_RANDOM(5,54), bVARCHAR(255),PRIMARYKEY (a));创建
TABLEt (aBIGINTAUTO_RANDOM(5,54), bVARCHAR(255),PRIMARYKEY (a, b));
You can wrap the keywordAUTO_RANDOM
in an executable comment. For more details, refer toTiDB specific comment syntax.
创建
TABLEt (abigint
/*T![auto_rand] AUTO_RANDOM */, bVARCHAR(255),PRIMARYKEY (a));创建
TABLEt (abigint
PRIMARYKEY/*T![auto_rand] AUTO_RANDOM */, bVARCHAR(255));创建
TABLEt (aBIGINT
/*T![auto_rand] AUTO_RANDOM(6) */, bVARCHAR(255),PRIMARYKEY (a));创建
TABLEt (aBIGINT
/*T![auto_rand] AUTO_RANDOM(5, 54) */, bVARCHAR(255),PRIMARYKEY (a));
当你执行一个INSERT
statement:
- 如果你明确specify the value of the
AUTO_RANDOM
column, it is inserted into the table as is. - If you do not explicitly specify the value of the
AUTO_RANDOM
column, TiDB generates a random value and inserts it into the table.
tidb>
创建
TABLEt (aBIGINT
PRIMARYKEY AUTO_RANDOM, bVARCHAR(255)); Query OK,0
rowsaffected,1warning (0.01sec) tidb>
INSERT
INTOt(a, b)VALUES(1,'string'); Query OK,1
rowaffected (0.00sec) tidb>
SELECT
*
FROMt;+
---+--------+
|a|b|
+
---+--------+
|
1
|string|
+
---+--------+
1
row
in
set(0.01sec) tidb>
INSERT
INTOt(b)VALUES('string2'); Query OK,1
rowaffected (0.00sec) tidb>
INSERT
INTOt(b)VALUES('string3'); Query OK,1
rowaffected (0.00sec) tidb>
SELECT
*
FROMt;+
---------------------+---------+
|a|b|
+
---------------------+---------+
|
1
|string|
|
1152921504606846978
|string2|
|
4899916394579099651
|string3|
+
---------------------+---------+
3
rows
in
set(0.00sec)
TheAUTO_RANDOM(S, R)
column value automatically assigned by TiDB has a total of 64 bits:
S
是数量of shard bits. The value ranges from1
to15
. The default value is5
.R
is the total length of the automatic allocation range. The value ranges from32
to64
. The default value is64
.
The structure of anAUTO_RANDOM
value is as follows:
Total number of bits | Sign bit | Reserved bits | Shard bits | Auto-increment bits |
---|---|---|---|---|
64 bits | 0/1 bit | (64-R) bits | S bits | (R-1-S) bits |
- The length of the sign bit is determined by the existence of an
UNSIGNED
attribute. If there is anUNSIGNED
attribute, the length is0
. Otherwise, the length is1
. - The length of the reserved bits is
64-R
. The reserved bits are always0
. - The content of the shard bits is obtained by calculating the hash value of the starting time of the current transaction. To use a different length of shard bits (such as 10), you can specify
AUTO_RANDOM(10)
when creating the table. - The value of the auto-increment bits is stored in the storage engine and allocated sequentially. Each time a new value is allocated, the value is incremented by 1. The auto-increment bits ensure that the values of
AUTO_RANDOM
are unique globally. When the auto-increment bits are exhausted, an errorFailed to read auto-increment value from storage engine
is reported when the value is allocated again.
Values allocated implicitly to theAUTO_RANDOM
column affectlast_insert_id()
. To get the ID that TiDB last implicitly allocates, you can use theSELECT last_insert_id ()
statement.
To view the shard bits number of the table with anAUTO_RANDOM
column, you can execute theSHOW CREATE TABLE
statement. You can also see the value of thePK_AUTO_RANDOM_BITS=x
mode in theTIDB_ROW_ID_SHARDING_INFO
column in theinformation_schema.tables
system table.x
是数量of shard bits.
After creating a table with anAUTO_RANDOM
column, you can useSHOW WARNINGS
to view the maximum implicit allocation times:
创建
TABLEt (aBIGINTAUTO_RANDOM, bVARCHAR(255),PRIMARYKEY (a));SHOWWARNINGS;
The output is as follows:
+
-------+------+---------------------------------------------------------+
|水平|Code|Message|
+
-------+------+---------------------------------------------------------+
|Note|
1105
|Available implicit allocation times:288230376151711743
|
+
-------+------+---------------------------------------------------------+
1
row
in
set(0.00sec)
Restrictions
Pay attention to the following restrictions when you useAUTO_RANDOM
:
- To insert values explicitly, you need to set the value of the
@@allow_auto_random_explicit_insert
system variable to1
(0
by default). It isnotrecommended that you explicitly specify a value for the column with theAUTO_RANDOM
attribute when you insert data. Otherwise, the numeral values that can be automatically allocated for this table might be used up in advance. - Specify this attribute for the primary key columnONLYas the
BIGINT
type. Otherwise, an error occurs. In addition, when the attribute of the primary key isNONCLUSTERED
,AUTO_RANDOM
is not supported even on the integer primary key. For more details about the primary key of theCLUSTERED
type, refer toclustered index. - You cannot use
ALTER TABLE
to modify theAUTO_RANDOM
attribute, including adding or removing this attribute. - You cannot use
ALTER TABLE
to change fromAUTO_INCREMENT
toAUTO_RANDOM
if the maximum value is close to the maximum value of the column type. - You cannot change the column type of the primary key column that is specified with
AUTO_RANDOM
attribute. - You cannot specify
AUTO_RANDOM
andAUTO_INCREMENT
for the same column at the same time. - You cannot specify
AUTO_RANDOM
andDEFAULT
(the default value of a column) for the same column at the same time. - When
AUTO_RANDOM
is used on a column, it is difficult to change the column attribute back toAUTO_INCREMENT
because the auto-generated values might be very large.