AUTO_RANDOM New in v3.1.0
User scenario
Since the value of AUTO_RANDOM is random and unique, AUTO_RANDOM is often used in place of AUTO_INCREMENT to avoid write hotspot in a single storage node caused by TiDB assigning consecutive IDs. If the current AUTO_INCREMENT column is a primary key and the type is BIGINT, you can execute the ALTER TABLE t MODIFY COLUMN id BIGINT AUTO_RANDOM(5); statement to switch from AUTO_INCREMENT to AUTO_RANDOM.
For more information about how to handle highly concurrent write-heavy workloads in TiDB, see Highly concurrent write best practices.
Basic concepts
AUTO_RANDOM is a column attribute that is used to automatically assign values to a BIGINT column. Values assigned automatically are random and unique.
To create a table with an AUTO_RANDOM column, you can use the following statements. The AUTO_RANDOM column must be included in a primary key, and the primary key must only have the AUTO_RANDOM column.
CREATE TABLE t (a BIGINT AUTO_RANDOM, b VARCHAR(255), PRIMARY KEY (a));
CREATE TABLE t (a BIGINT PRIMARY KEY AUTO_RANDOM, b VARCHAR(255));
CREATE TABLE t (a BIGINT AUTO_RANDOM(6), b VARCHAR(255), PRIMARY KEY (a));
You can wrap the keyword AUTO_RANDOM in an executable comment. For more details, refer to TiDB specific comment syntax.
CREATE TABLE t (a bigint /*T![auto_rand] AUTO_RANDOM */, b VARCHAR(255), PRIMARY KEY (a));
CREATE TABLE t (a bigint PRIMARY KEY /*T![auto_rand] AUTO_RANDOM */, b VARCHAR(255));
CREATE TABLE t (a BIGINT /*T![auto_rand] AUTO_RANDOM(6) */, b VARCHAR(255), PRIMARY KEY (a));
When you execute an INSERT statement:
- If you explicitly specify the value of the
AUTO_RANDOMcolumn, it is inserted into the table as is. - If you do not explicitly specify the value of the
AUTO_RANDOMcolumn, TiDB generates a random value and inserts it into the table.
tidb> CREATE TABLE t (a BIGINT PRIMARY KEY AUTO_RANDOM, b VARCHAR(255));
Query OK, 0 rows affected, 1 warning (0.01 sec)
tidb> INSERT INTO t(a, b) VALUES (1, 'string');
Query OK, 1 row affected (0.00 sec)
tidb> SELECT * FROM t;
+---+--------+
| a | b |
+---+--------+
| 1 | string |
+---+--------+
1 row in set (0.01 sec)
tidb> INSERT INTO t(b) VALUES ('string2');
Query OK, 1 row affected (0.00 sec)
tidb> INSERT INTO t(b) VALUES ('string3');
Query OK, 1 row affected (0.00 sec)
tidb> SELECT * FROM t;
+---------------------+---------+
| a | b |
+---------------------+---------+
| 1 | string |
| 1152921504606846978 | string2 |
| 4899916394579099651 | string3 |
+---------------------+---------+
3 rows in set (0.00 sec)
The AUTO_RANDOM(S) column value automatically assigned by TiDB has a total of 64 bits. S is the number of shard bits. The value ranges from 1 to 15. The default value is 5.
The structure of an AUTO_RANDOM value is as follows:
| Total number of bits | Sign bit | Shard bits | Auto-increment bits |
|---|---|---|---|
| 64 bits | 0/1 bit | S bits | (64-1-S) bits |
- The length of the sign bit is determined by the existence of an
UNSIGNEDattribute. If there is anUNSIGNEDattribute, the length is0. Otherwise, the length is1. - 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_RANDOMare unique globally. When the auto-increment bits are exhausted, an errorFailed to read auto-increment value from storage engineis reported when the value is allocated again.
Values allocated implicitly to the AUTO_RANDOM column affect last_insert_id(). To get the ID that TiDB last implicitly allocates, you can use the SELECT last_insert_id () statement.
To view the shard bits number of the table with an AUTO_RANDOM column, you can execute the SHOW CREATE TABLE statement. You can also see the value of the PK_AUTO_RANDOM_BITS=x mode in the TIDB_ROW_ID_SHARDING_INFO column in the information_schema.tables system table. x is the number of shard bits.
Restrictions
Pay attention to the following restrictions when you use AUTO_RANDOM:
- To insert values explicitly, you need to set the value of the
@@allow_auto_random_explicit_insertsystem variable to1(0by default). It is not recommended that you explicitly specify a value for the column with theAUTO_RANDOMattribute 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 column ONLY as the
BIGINTtype. Otherwise, an error occurs. In addition, when the attribute of the primary key isNONCLUSTERED,AUTO_RANDOMis not supported even on the integer primary key. For more details about the primary key of theCLUSTEREDtype, refer to clustered index. - You cannot use
ALTER TABLEto modify theAUTO_RANDOMattribute, including adding or removing this attribute. - You cannot use
ALTER TABLEto change fromAUTO_INCREMENTtoAUTO_RANDOMif 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_RANDOMattribute. - You cannot specify
AUTO_RANDOMandAUTO_INCREMENTfor the same column at the same time. - You cannot specify
AUTO_RANDOMandDEFAULT(the default value of a column) for the same column at the same time. - When
AUTO_RANDOMis used on a column, it is difficult to change the column attribute back toAUTO_INCREMENTbecause the auto-generated values might be very large.