Skip to content
Merged
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 53 additions & 0 deletions functions-and-operators/tidb-functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,3 +329,56 @@ select tidb_decode_sql_digests(@digests, 10);

- [`Statement Summary Tables`](/statement-summary-tables.md)
- [`INFORMATION_SCHEMA.TIDB_TRX`](/information-schema/information-schema-tidb-trx.md)

## TIDB_SHARD

`TIDB_SHARD` 函数用于创建一个 SHARD INDEX 来打散热点索引。当二级唯一索引 `uk((tidb_shard(a)), a))` 的索引字段 `a` 上存在因单调递增或递减而导致的热点时,索引的前缀 `tidb_shard(a)` 将热点打散,从而提升集群扩展性。

在高吞吐写入、点查询、批量点查询场景下,你可以在保留原有的查询条件的情况下使用该函数,以提升写入性能。

> **注意 SHARD INDEX 使用场景限制:**
>
> - 二级唯一索引上 key 值存在单调递增或递减导致的写入热点,且该索引包含的列是整形值
> - 业务中 SQL 语句根据该二级索引的全部字段做等值查询,查询可以是单独的 SELECT,也可以是 UPDATE/DELETE 等产生的内部查询,等值查询包括 "a = 1" 或 "a IN (1, 2, ......)" 两种方式

```SQL
create table test(id int primary key clustered, a int, b int, unique key uk((tidb_shard(a)), a));
```

### 语法图

```
TIDBShardExpr ::=
"TIDB_SHARD" "(" expr ")"
```

### 示例

{{< copyable "sql" >}}

```sql
select TIDB_SHARD(12373743746);
```

```sql
+-------------------------+
| TIDB_SHARD(12373743746) |
+-------------------------+
| 184 |
+-------------------------+
1 row in set (0.00 sec)
```

上述示例会使用 `TIDB_SHARD` 函数计算 `12373743746` 的 SHARD 值。

{{< copyable "sql" >}}

```sql
create table test(id int primary key clustered, a int, b int, unique key uk((tidb_shard(a)), a));
```

上述示例使用 `TIDB_SHARD` 函数创建 SHARD INDEX。

### MySQL 兼容性

`TIDB_SHARD` 是 TiDB 特有的函数,和 MySQL 不兼容。