From 58322284418af8cb0d176d4832c92b04063ab8b7 Mon Sep 17 00:00:00 2001 From: wjHuang Date: Wed, 4 Mar 2020 21:40:26 +0800 Subject: [PATCH] reference/sql: add document for expression index (#2312) * add doc for expression * fmt * fix typo * sql: refine language * address comment * fix * update * fix * fix * address comment * address comment Co-authored-by: TomShawn <41534398+TomShawn@users.noreply.github.com> --- reference/sql/statements/create-index.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reference/sql/statements/create-index.md b/reference/sql/statements/create-index.md index fc2b24a1b2ed..bab99b77967a 100644 --- a/reference/sql/statements/create-index.md +++ b/reference/sql/statements/create-index.md @@ -128,6 +128,30 @@ CREATE UNIQUE INDEX c1 ON t1 (c1); Query OK, 0 rows affected (0.31 sec) ``` +## 表达式索引 + +TiDB 不仅能将索引建立在表中的一个或多个列上,还可以将索引建立在一个表达式上。当查询涉及表达式时,表达式索引能够加速这些查询。 + +考虑以下查询: + +{{< copyable "sql" >}} + +```sql +SELECT * FROM t WHERE lower(name) = "pingcap"; +``` + +如果建立了如下的表达式索引,就可以使用索引加速以上查询: + +{{< copyable "sql" >}} + +```sql +CREATE INDEX idx ON t ((lower(name))); +``` + +维护表达式索引的代价比一般的索引更高,因为在插入或者更新每一行时都需要计算出表达式的值。因为表达式的值已经存储在索引中,所以当优化器选择表达式索引时,表达式的值就不需要再计算。因此,当查询速度比插入速度和更新速度更重要时,可以考虑建立表达式索引。 + +表达式索引的语法和限制与 MySQL 相同,是通过将索引建立在隐藏的虚拟生成列 (generated virtual column) 上来实现的。因此所支持的表达式继承了虚拟生成列的所有[限制](/reference/sql/generated-columns.md#局限性)。目前,建立了索引的表达式只有在 `FIELD` 子句、`WHERE` 子句和 `ORDER BY` 子句中时,优化器才能使用表达式索引。后续将支持 `GROUP BY` 子句。 + ## 相关 session 变量 和 `CREATE INDEX` 语句相关的全局变量有 `tidb_ddl_reorg_worker_cnt`,`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考 [TiDB 特定系统变量](/reference/configuration/tidb-server/tidb-specific-variables.md#tidb_ddl_reorg_worker_cnt)。