Skip to content
Merged
Changes from all 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
70 changes: 70 additions & 0 deletions functions-and-operators/tidb-functions.md
Original file line number Diff line number Diff line change
Expand Up @@ -329,3 +329,73 @@ 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 来打散热点索引。SHARD INDEX 是一种以 `TIDB_SHARD` 函数为前缀的表达式索引。

### SHARD INDEX

- 创建方式:

当二级唯一索引 `uk((tidb_shard(a)), a))` 的索引字段 `a` 上存在因单调递增或递减而产生的热点时,索引的前缀 `tidb_shard(a)` 会打散热点,从而提升集群扩展性。

- 适用场景:

- 二级唯一索引上 key 值存在单调递增或递减导致的写入热点,且该索引包含的列是整型。
- 业务中 SQL 语句根据该二级索引的全部字段做等值查询,查询可以是单独的 `SELECT`,也可以是 `UPDATE`,`DELETE` 等产生的内部查询,等值查询包括 `a = 1` 或 `a IN (1, 2, ......)` 两种方式。

- 使用限制:

- 非等值或 `IN` 查询无法使用索引。
- 查询条件中 `AND` 和 `OR` 混合且最外层是 `AND` 算子时无法使用 SHARED INDEX。
- `GROUP BY` 无法使用 SHARED INDEX。
- `ORDER BY` 无法使用 SHARED INDEX。
- `ON` 子句无法使用 SHARED INDEX。
- `WHERE` 子查询无法使用 SHARED INDEX。
- SHARED INDEX 只能打散整型字段的唯一索引。
- SHARED INDEX 联合索引可能失效。
- SHARED INDEX 无法走 FastPlan 流程。
- SHARED INDEX 无法使用执行计划缓存。

### 语法图

```ebnf+diagram
TIDBShardExpr ::=
"TIDB_SHARD" "(" expr ")"
```

### 示例

- 使用 `TIDB_SHARD` 函数计算 SHARD 值

以下示例说明如何使用 `TIDB_SHARD` 函数计算 `12373743746` 的 SHARD 值。

{{< copyable "sql" >}}

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

- 计算得出 SHARD 值为:

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

- 使用 `TIDB_SHARD` 函数创建 SHARD INDEX

{{< copyable "sql" >}}

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

### MySQL 兼容性

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