From a4af9371141f028404a455ae90b2b084b92742b5 Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Mon, 5 Jul 2021 15:41:28 +0800 Subject: [PATCH 1/3] This is an automated cherry-pick of #6588 Signed-off-by: ti-chi-bot --- sql-statements/sql-statement-create-index.md | 53 ++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/sql-statements/sql-statement-create-index.md b/sql-statements/sql-statement-create-index.md index c3e21042863e..3c8d5fb3b89f 100644 --- a/sql-statements/sql-statement-create-index.md +++ b/sql-statements/sql-statement-create-index.md @@ -128,9 +128,62 @@ CREATE UNIQUE INDEX c1 ON t1 (c1); Query OK, 0 rows affected (0.31 sec) ``` +<<<<<<< HEAD ## 相关 session 变量 和 `CREATE INDEX` 语句相关的全局变量有 `tidb_ddl_reorg_worker_cnt`,`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考 [TiDB 特定系统变量](/tidb-specific-system-variables.md#tidb_ddl_reorg_worker_cnt)。 +======= +## 表达式索引 + +> **注意:** +> +> 该功能目前为实验特性,不建议在生产环境中使用。 + +如果需要使用这一特性,在 [TiDB 配置文件](/tidb-configuration-file.md#allow-expression-index-从-v400-版本开始引入)中进行以下设置: + +{{< copyable "sql" >}} + +```sql +allow-expression-index = true +``` + +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) 上来实现的。因此所支持的表达式继承了虚拟生成列的所有[限制](/generated-columns.md#生成列的局限性)。目前,建立了索引的表达式只有在 `FIELD` 子句、`WHERE` 子句和 `ORDER BY` 子句中时,优化器才能使用表达式索引。后续将支持 `GROUP BY` 子句。 + +## 不可见索引 + +不可见索引(Invisible Indexes)不会被查询优化器使用: + +```sql +CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE(c2)); +CREATE UNIQUE INDEX c1 ON t1 (c1) INVISIBLE; +``` + +具体可以参考 [`ALTER INDEX`](/sql-statements/sql-statement-alter-index.md)。 + +## 相关系统变量 + +和 `CREATE INDEX` 语句相关的系统变量有 `tidb_ddl_reorg_worker_cnt` 、`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考[系统变量](/system-variables.md#tidb_ddl_reorg_worker_cnt)。 +>>>>>>> db07f000e (Update the related variable description for CREATE INDEX (#6588)) ## MySQL 兼容性 From a48a3d5eaeedd037786ef3913293d77903634095 Mon Sep 17 00:00:00 2001 From: qiancai Date: Mon, 5 Jul 2021 19:52:34 +0800 Subject: [PATCH 2/3] Update sql-statement-create-index.md --- sql-statements/sql-statement-create-index.md | 55 +------------------- 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/sql-statements/sql-statement-create-index.md b/sql-statements/sql-statement-create-index.md index 3c8d5fb3b89f..a1365442e3f1 100644 --- a/sql-statements/sql-statement-create-index.md +++ b/sql-statements/sql-statement-create-index.md @@ -128,62 +128,9 @@ CREATE UNIQUE INDEX c1 ON t1 (c1); Query OK, 0 rows affected (0.31 sec) ``` -<<<<<<< HEAD -## 相关 session 变量 - -和 `CREATE INDEX` 语句相关的全局变量有 `tidb_ddl_reorg_worker_cnt`,`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考 [TiDB 特定系统变量](/tidb-specific-system-variables.md#tidb_ddl_reorg_worker_cnt)。 -======= -## 表达式索引 - -> **注意:** -> -> 该功能目前为实验特性,不建议在生产环境中使用。 - -如果需要使用这一特性,在 [TiDB 配置文件](/tidb-configuration-file.md#allow-expression-index-从-v400-版本开始引入)中进行以下设置: - -{{< copyable "sql" >}} - -```sql -allow-expression-index = true -``` - -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) 上来实现的。因此所支持的表达式继承了虚拟生成列的所有[限制](/generated-columns.md#生成列的局限性)。目前,建立了索引的表达式只有在 `FIELD` 子句、`WHERE` 子句和 `ORDER BY` 子句中时,优化器才能使用表达式索引。后续将支持 `GROUP BY` 子句。 - -## 不可见索引 - -不可见索引(Invisible Indexes)不会被查询优化器使用: - -```sql -CREATE TABLE t1 (c1 INT, c2 INT, UNIQUE(c2)); -CREATE UNIQUE INDEX c1 ON t1 (c1) INVISIBLE; -``` - -具体可以参考 [`ALTER INDEX`](/sql-statements/sql-statement-alter-index.md)。 - ## 相关系统变量 -和 `CREATE INDEX` 语句相关的系统变量有 `tidb_ddl_reorg_worker_cnt` 、`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考[系统变量](/system-variables.md#tidb_ddl_reorg_worker_cnt)。 ->>>>>>> db07f000e (Update the related variable description for CREATE INDEX (#6588)) +和 `CREATE INDEX` 语句相关的系统变量有 `tidb_ddl_reorg_worker_cnt` 、`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考[TiDB 特定系统变量](/system-variables.md#tidb_ddl_reorg_worker_cnt)。 ## MySQL 兼容性 From a7a993209fc9ac238164852483baeb01963ef59c Mon Sep 17 00:00:00 2001 From: Grace Cai Date: Mon, 5 Jul 2021 19:56:33 +0800 Subject: [PATCH 3/3] Update sql-statements/sql-statement-create-index.md --- sql-statements/sql-statement-create-index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-statements/sql-statement-create-index.md b/sql-statements/sql-statement-create-index.md index a1365442e3f1..d3c5da6d4882 100644 --- a/sql-statements/sql-statement-create-index.md +++ b/sql-statements/sql-statement-create-index.md @@ -130,7 +130,7 @@ Query OK, 0 rows affected (0.31 sec) ## 相关系统变量 -和 `CREATE INDEX` 语句相关的系统变量有 `tidb_ddl_reorg_worker_cnt` 、`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考[TiDB 特定系统变量](/system-variables.md#tidb_ddl_reorg_worker_cnt)。 +和 `CREATE INDEX` 语句相关的系统变量有 `tidb_ddl_reorg_worker_cnt` 、`tidb_ddl_reorg_batch_size` 和 `tidb_ddl_reorg_priority`,具体可以参考[TiDB 特定系统变量](/tidb-specific-system-variables.md#tidb_ddl_reorg_worker_cnt)。 ## MySQL 兼容性