Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
wjhuang2016 committed Mar 4, 2020
1 parent bd856c1 commit 2ae5dc4
Showing 1 changed file with 12 additions and 2 deletions.
14 changes: 12 additions & 2 deletions reference/sql/statements/create-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -130,14 +130,24 @@ Query OK, 0 rows affected (0.31 sec)

## 表达式索引

TiDB 支持创建表达式索引,即将索引建立在一个表达式上。示例如下:
TiDB 不仅能将索引建立在表中的一个或多个列上,还可以将索引建立在一个表达式上。当查询涉及表达式时,表达式索引能够加速这些查询。示例如下:

考虑以下查询:

{{< copyable "sql" >}}

```sql
CREATE INDEX c1_expr ON t1 ((c1+1));
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 变量
Expand Down

0 comments on commit 2ae5dc4

Please sign in to comment.