- 关于 TiDB
- 快速上手
- 部署集群
- 数据迁移
- 运维操作
- 升级 TiDB 版本
- 扩缩容
- 备份与恢复
- 使用 BR 工具(推荐)
- 读取历史数据
- 修改时区
- 日常巡检
- TiFlash 常用运维操作
- TiUP 常用运维操作
- 在线修改集群配置
- 监控与告警
- 故障诊断
- 性能调优
- 系统调优
- 软件调优
- SQL 性能调优
- SQL 性能调优概览
- 理解 TiDB 执行计划
- SQL 优化流程
- 控制执行计划
- 教程
- TiDB 生态工具
- 参考指南
- 架构
- 监控指标
- 安全加固
- 权限
- SQL
- SQL 语言结构和语法
- SQL 语句
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ALTER DATABASE
ALTER INDEX
ALTER INSTANCE
ALTER TABLE
ALTER USER
ANALYZE TABLE
BACKUP
BEGIN
CHANGE COLUMN
CHANGE DRAINER
CHANGE PUMP
COMMIT
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW [BACKUPS|RESTORES]
SHOW ANALYZE STATUS
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TRACE
TRUNCATE
UPDATE
USE
- 数据类型
- 函数与操作符
- 聚簇索引
- 约束
- 生成列
- SQL 模式
- 事务
- 垃圾回收 (GC)
- 视图
- 分区表
- 字符集和排序规则
- 系统表
mysql
- INFORMATION_SCHEMA
- Overview
ANALYZE_STATUS
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DDL_JOBS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PROCESSLIST
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_INDEXES
TIDB_SERVERS_INFO
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- CLI
- 命令行参数
- 配置文件参数
- 系统变量
- 存储引擎
- TiKV
- TiFlash
- TiUP
- 遥测
- 错误码
- 通过拓扑 label 进行副本调度
- 常见问题解答 (FAQ)
- 术语表
- 版本发布历史
AUTO_RANDOM 从 v3.1.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
)。默认不支持显式插入的具体原因请参考使用限制一节。
自动分配值的计算方式如下:
该行值在二进制形式下,除去符号位的最高五位(称为 shard bits)由当前事务的开始时间决定,剩下的位数按照自增的顺序分配。
若要使用一个不同的 shard bits 的数量,可以在 AUTO_RANDOM
后面加一对括号,并在括号中指定想要的 shard bits 数量。示例如下:
CREATE TABLE t (a bigint PRIMARY KEY AUTO_RANDOM(3), b varchar(255))
以上建表语句中,shard bits 的数量为 3
。shard bits 的数量的取值范围是 [1, field_max_bits)
,其中 field_max_bits
为整型主键列类型占用的位长度。
创建完表后,使用 SHOW WARNINGS
可以查看当前表可支持的最大隐式分配的次数:
SHOW WARNINGS
+-------+------+----------------------------------------------------------+
| Level | Code | Message |
+-------+------+----------------------------------------------------------+
| Note | 1105 | Available implicit allocation times: 1152921504606846976 |
+-------+------+----------------------------------------------------------+
注意:
为保证可隐式分配的次数最大,从 v4.0.3 开始,
AUTO_RANDOM
列类型只能为BIGINT
。
另外,要查看某张含有 AUTO_RANDOM
属性的表的 shard bits 数量,可以在系统表 information_schema.tables
中 TIDB_ROW_ID_SHARDING_INFO
一列看到模式为 PK_AUTO_RANDOM_BITS=x
的值,其中 x
为 shard bits 的数量。
AUTO RANDOM
列隐式分配的值会影响 last_insert_id()
。可以使用 SELECT last_insert_id()
获取上一次 TiDB 隐式分配的 ID,例如:
INSERT INTO t (b) VALUES ("b")
SELECT * FROM t;
SELECT last_insert_id()
可能得到的结果如下:
+------------+---+
| a | b |
+------------+---+
| 1073741825 | b |
+------------+---+
+------------------+
| last_insert_id() |
+------------------+
| 1073741825 |
+------------------+
兼容性
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
列的值。不恰当地显式赋值,可能会导致该表提前耗尽用于自动分配的数值。