Skip to content

Commit

Permalink
reference/sql: add document for expression index (#2312)
Browse files Browse the repository at this point in the history
* 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>
  • Loading branch information
wjhuang2016 and TomShawn committed Mar 4, 2020
1 parent d68c3a8 commit 5832228
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions reference/sql/statements/create-index.md
Expand Up @@ -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)
Expand Down

0 comments on commit 5832228

Please sign in to comment.