diff --git a/TOC.md b/TOC.md index 5816f8ef471f..db3d0588d4b4 100644 --- a/TOC.md +++ b/TOC.md @@ -227,6 +227,7 @@ + 属性 + [AUTO_INCREMENT](/auto-increment.md) + [AUTO_RANDOM](/auto-random.md) + + [SHARD_ROW_ID_BITS](/shard-row-id-bits.md) + [字面值](/literal-values.md) + [Schema 对象名](/schema-object-names.md) + [关键字](/keywords.md) diff --git a/best-practices/high-concurrency-best-practices.md b/best-practices/high-concurrency-best-practices.md index 54e08b0f189f..d6e268b26770 100644 --- a/best-practices/high-concurrency-best-practices.md +++ b/best-practices/high-concurrency-best-practices.md @@ -173,7 +173,7 @@ SPLIT TABLE TEST_HOTSPOT BETWEEN (0) AND (9223372036854775807) REGIONS 128; **问题一:** -如果表没有主键或者主键不是整数类型,而且用户也不想自己生成一个随机分布的主键 ID 的话,TiDB 内部有一个隐式的 `_tidb_rowid` 列作为行 ID。在不使用 `SHARD_ROW_ID_BITS` 的情况下,`_tidb_rowid` 列的值基本也为单调递增,此时也会有写热点存在(参阅 [`SHARD_ROW_ID_BITS` 的详细说明](/tidb-specific-system-variables.md#shard_row_id_bits))。 +如果表没有主键或者主键不是整数类型,而且用户也不想自己生成一个随机分布的主键 ID 的话,TiDB 内部有一个隐式的 `_tidb_rowid` 列作为行 ID。在不使用 `SHARD_ROW_ID_BITS` 的情况下,`_tidb_rowid` 列的值基本也为单调递增,此时也会有写热点存在(参阅 [`SHARD_ROW_ID_BITS` 的详细说明](/shard-row-id-bits.md))。 要避免由 `_tidb_rowid` 带来的写入热点问题,可以在建表时,使用 `SHARD_ROW_ID_BITS` 和 `PRE_SPLIT_REGIONS` 这两个建表选项(参阅 [`PRE_SPLIT_REGIONS` 的详细说明](/sql-statements/sql-statement-split-region.md#pre_split_regions))。 diff --git a/faq/sql-faq.md b/faq/sql-faq.md index 96bde8a0f608..a72296f0e891 100644 --- a/faq/sql-faq.md +++ b/faq/sql-faq.md @@ -214,7 +214,7 @@ ID 没什么规律,只要是唯一就行,不过生成的时候,是有一 ### 如何打散热点 -TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指的是 Region 的读写访问热点。而 TiDB 中对于 PK 非整数或没有 PK 的表,可以通过设置 `SHARD_ROW_ID_BITS` 来适度分解 Region 分片,以达到打散 Region 热点的效果。详情可参考官网 [TiDB 专用系统变量和语法](/tidb-specific-system-variables.md#shard_row_id_bits)中 `SHARD_ROW_ID_BITS` 的介绍。 +TiDB 中以 Region 分片来管理数据库,通常来讲,TiDB 的热点指的是 Region 的读写访问热点。而 TiDB 中对于非整数主键或没有主键的表,可以通过设置 `SHARD_ROW_ID_BITS` 来适度分解 Region 分片,以达到打散 Region 热点的效果。详情可参考官网 [SHARD_ROW_ID_BITS](/shard-row-id-bits.md)中的介绍。 ### TiKV 性能参数调优 diff --git a/shard-row-id-bits.md b/shard-row-id-bits.md new file mode 100644 index 000000000000..a64dbd0aec66 --- /dev/null +++ b/shard-row-id-bits.md @@ -0,0 +1,24 @@ +--- +title: SHARD_ROW_ID_BITS +summary: 介绍 TiDB 的 `SHARD_ROW_ID_BITS` 表属性。 +category: reference +--- + +# SHARD_ROW_ID_BITS + +本文介绍表属性 `SHARD_ROW_ID_BITS`,它用来设置隐式 `_tidb_rowid` 分片数量的 bit 位数。 + +## 基本概念 + +对于非整数主键或没有主键的表,TiDB 会使用一个隐式的自增 rowid。大量执行 `INSERT` 插入语句时会把数据集中写入单个 Region,造成写入热点。 + +通过设置 `SHARD_ROW_ID_BITS`,可以把 rowid 打散写入多个不同的 Region,缓解写入热点问题。但是设置的过大会造成 RPC 请求数放大,增加 CPU 和网络开销。 + +- `SHARD_ROW_ID_BITS = 4` 表示 16 个分片 +- `SHARD_ROW_ID_BITS = 6` 表示 64 个分片 +- `SHARD_ROW_ID_BITS = 0` 表示默认值 1 个分片 + +## 语句示例 + +- `CREATE TABLE`:`CREATE TABLE t (c int) SHARD_ROW_ID_BITS = 4;` +- `ALTER TABLE`:`ALTER TABLE t SHARD_ROW_ID_BITS = 4;` diff --git a/sql-statements/sql-statement-create-table.md b/sql-statements/sql-statement-create-table.md index 000618aa688b..71742c444384 100644 --- a/sql-statements/sql-statement-create-table.md +++ b/sql-statements/sql-statement-create-table.md @@ -228,7 +228,7 @@ table_option: | STATS_PERSISTENT [=] {DEFAULT|0|1} ``` -`table_option` 目前支持的只有 `AUTO_INCREMENT`、`SHARD_ROW_ID_BITS`(详情介绍请参考 [TiDB 专用系统变量和语法](/tidb-specific-system-variables.md#shard_row_id_bits))、`PRE_SPLIT_REGIONS`、`CHARACTER SET`、`COLLATE` 和 `COMMENT`,其它只是语法上支持。具体内容参考下表,各个子句之间用逗号隔开。 +`table_option` 目前支持的只有 `AUTO_INCREMENT`、`SHARD_ROW_ID_BITS`(详情介绍请参考 [SHARD_ROW_ID_BITS](/shard-row-id-bits.md))、`PRE_SPLIT_REGIONS`、`CHARACTER SET`、`COLLATE` 和 `COMMENT`,其它只是语法上支持。具体内容参考下表,各个子句之间用逗号隔开。 | 参数 |含义 |举例 | |----------------|--------------------------------------|----------------------------|