diff --git a/functions-and-operators/tidb-functions.md b/functions-and-operators/tidb-functions.md index 87793e78b011..88362db1d80c 100644 --- a/functions-and-operators/tidb-functions.md +++ b/functions-and-operators/tidb-functions.md @@ -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 不兼容。