@@ -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