Skip to content

Commit 7164cf1

Browse files
authored
tidb-functions: update tidb-functions.md doc (#8775)
1 parent 2f97d40 commit 7164cf1

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

functions-and-operators/tidb-functions.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,3 +329,73 @@ select tidb_decode_sql_digests(@digests, 10);
329329
330330
- [`Statement Summary Tables`](/statement-summary-tables.md)
331331
- [`INFORMATION_SCHEMA.TIDB_TRX`](/information-schema/information-schema-tidb-trx.md)
332+
333+
## TIDB_SHARD
334+
335+
`TIDB_SHARD` 函数用于创建一个 SHARD INDEX 来打散热点索引。SHARD INDEX 是一种以 `TIDB_SHARD` 函数为前缀的表达式索引。
336+
337+
### SHARD INDEX
338+
339+
- 创建方式:
340+
341+
当二级唯一索引 `uk((tidb_shard(a)), a))` 的索引字段 `a` 上存在因单调递增或递减而产生的热点时,索引的前缀 `tidb_shard(a)` 会打散热点,从而提升集群扩展性。
342+
343+
- 适用场景:
344+
345+
- 二级唯一索引上 key 值存在单调递增或递减导致的写入热点,且该索引包含的列是整型。
346+
- 业务中 SQL 语句根据该二级索引的全部字段做等值查询,查询可以是单独的 `SELECT`,也可以是 `UPDATE`,`DELETE` 等产生的内部查询,等值查询包括 `a = 1` 或 `a IN (1, 2, ......)` 两种方式。
347+
348+
- 使用限制:
349+
350+
- 非等值或 `IN` 查询无法使用索引。
351+
- 查询条件中 `AND` 和 `OR` 混合且最外层是 `AND` 算子时无法使用 SHARED INDEX。
352+
- `GROUP BY` 无法使用 SHARED INDEX。
353+
- `ORDER BY` 无法使用 SHARED INDEX。
354+
- `ON` 子句无法使用 SHARED INDEX。
355+
- `WHERE` 子查询无法使用 SHARED INDEX。
356+
- SHARED INDEX 只能打散整型字段的唯一索引。
357+
- SHARED INDEX 联合索引可能失效。
358+
- SHARED INDEX 无法走 FastPlan 流程。
359+
- SHARED INDEX 无法使用执行计划缓存。
360+
361+
### 语法图
362+
363+
```ebnf+diagram
364+
TIDBShardExpr ::=
365+
"TIDB_SHARD" "(" expr ")"
366+
```
367+
368+
### 示例
369+
370+
- 使用 `TIDB_SHARD` 函数计算 SHARD 值
371+
372+
以下示例说明如何使用 `TIDB_SHARD` 函数计算 `12373743746` 的 SHARD 值。
373+
374+
{{< copyable "sql" >}}
375+
376+
```sql
377+
select TIDB_SHARD(12373743746);
378+
```
379+
380+
- 计算得出 SHARD 值为:
381+
382+
```sql
383+
+-------------------------+
384+
| TIDB_SHARD(12373743746) |
385+
+-------------------------+
386+
| 184 |
387+
+-------------------------+
388+
1 row in set (0.00 sec)
389+
```
390+
391+
- 使用 `TIDB_SHARD` 函数创建 SHARD INDEX
392+
393+
{{< copyable "sql" >}}
394+
395+
```sql
396+
create table test(id int primary key clustered, a int, b int, unique key uk((tidb_shard(a)), a));
397+
```
398+
399+
### MySQL 兼容性
400+
401+
`TIDB_SHARD` 是 TiDB 特有的函数,和 MySQL 不兼容。

0 commit comments

Comments
 (0)