Skip to content

Commit

Permalink
add SHARD_ROW_ID_BITS (#3770) (#3848)
Browse files Browse the repository at this point in the history
Signed-off-by: ti-srebot <ti-srebot@pingcap.com>

Co-authored-by: kissmydb <likun@pingcap.com>
  • Loading branch information
ti-srebot and kissmydb authored Jul 1, 2020
1 parent 3e63a18 commit cd993ce
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 3 deletions.
1 change: 1 addition & 0 deletions TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion best-practices/high-concurrency-best-practices.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))。

Expand Down
2 changes: 1 addition & 1 deletion faq/sql-faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 性能参数调优
Expand Down
24 changes: 24 additions & 0 deletions shard-row-id-bits.md
Original file line number Diff line number Diff line change
@@ -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;`
2 changes: 1 addition & 1 deletion sql-statements/sql-statement-create-table.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`,其它只是语法上支持。具体内容参考下表,各个子句之间用逗号隔开。

| 参数 |含义 |举例 |
|----------------|--------------------------------------|----------------------------|
Expand Down

0 comments on commit cd993ce

Please sign in to comment.