Skip to content

Commit

Permalink
Extend CAST and multi-valued-index docs (#17351) (#17359)
Browse files Browse the repository at this point in the history
  • Loading branch information
ti-chi-bot authored May 20, 2024
1 parent 747077d commit e2d064b
Show file tree
Hide file tree
Showing 3 changed files with 64 additions and 7 deletions.
10 changes: 5 additions & 5 deletions choose-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,15 +123,15 @@ mysql> SHOW WARNINGS;

1. 估算的行数量不准确?

一般是统计信息过期或者准确度不够造成的,可以重新执行 `analyze table` 或者修改 `analyze table` 的参数。
一般是统计信息过期或者准确度不够造成的,可以重新执行 `ANALYZE TABLE` 或者修改 `ANALYZE TABLE` 的参数。

2. 统计信息准确,为什么读 TiFlash 更快,而优化器选择了 TiKV?

目前区别 TiFlash 和 TiKV 的代价模型还比较粗糙,可以调小 `tidb_opt_seek_factor` 的值,让优化器倾向于选择 TiFlash。
目前区别 TiFlash 和 TiKV 的代价模型还比较粗糙,可以调小 [`tidb_opt_seek_factor`](/system-variables.md#tidb_opt_seek_factor) 的值,让优化器倾向于选择 TiFlash。

3. 统计信息准确,某个索引要回表,但是它比另一个不用回表的索引实际执行更快,为什么选择了不用回表的索引?

碰到这种情况,可能是代价估算时对于回表的代价计算得过大,可以调小 `tidb_opt_network_factor`,降低回表的代价。
碰到这种情况,可能是代价估算时对于回表的代价计算得过大,可以调小 [`tidb_opt_network_factor`](/system-variables.md#tidb_opt_network_factor),降低回表的代价。

## 控制索引的选择

Expand All @@ -143,7 +143,7 @@ mysql> SHOW WARNINGS;

## 使用多值索引

[多值索引](/sql-statements/sql-statement-create-index.md#多值索引)和普通索引有所不同,TiDB 目前只会使用 [IndexMerge](/explain-index-merge.md) 来访问多值索引。因此要想使用多值索引进行数据访问,请确保`tidb_enable_index_merge` 被设置为 `ON`
[多值索引](/sql-statements/sql-statement-create-index.md#多值索引)和普通索引有所不同,TiDB 目前只会使用 [IndexMerge](/explain-index-merge.md) 来访问多值索引。因此要想使用多值索引进行数据访问,请确保 [`tidb_enable_index_merge`](/system-variables.md#tidb_enable_index_merge-从-v40-版本开始引入) 被设置为 `ON`

多值索引的使用限制请参考 [`CREATE INDEX`](/sql-statements/sql-statement-create-index.md#特性与限制)

Expand Down
59 changes: 58 additions & 1 deletion functions-and-operators/cast-functions-and-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,32 @@ Cast 函数和操作符用于将某种数据类型的值转换为另一种数据

## CAST

[`CAST()`](https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast) 函数用于将一个表达式的值转换为指定的数据类型。
[`CAST(<expression> AS <type> [ARRAY])`](https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_cast) 函数用于将一个表达式的值转换为指定的数据类型。

此外,你还可以将该函数用于创建[多值索引](/sql-statements/sql-statement-create-index.md#多值索引)

支持的数据类型包括:

| 类型 | 描述 | 是否可用于多值索引 |
|----------------------|------------------|------------------------------------------------|
| `BINARY(n)` | 二进制字符串 ||
| `CHAR(n)` | 字符串 | 是,但仅当指定了长度时才有效 |
| `DATE` | 日期 ||
| `DATETIME(fsp)` | 日期/时间,其中 `fsp` 是可选的 ||
| `DECIMAL(n, m)` | 十进制数,其中 `n``m` 是可选的,如果未指定,则默认为 `10``0` ||
| `DOUBLE` | 双精度浮点数 ||
| `FLOAT(n)` | 浮点数,其中 `n` 是可选的,应介于 `0``53` 之间 ||
| `JSON` | JSON ||
| `REAL` | 浮点数 ||
| `SIGNED [INTEGER]` | 有符号整数 ||
| `TIME(fsp)` | 时间 ||
| `UNSIGNED [INTEGER]` | 无符号整数 ||
| `YEAR` |||

示例:

以下语句将二进制字符串从十六进制文字转换为 `CHAR`

```sql
SELECT CAST(0x54694442 AS CHAR);
```
Expand All @@ -44,6 +64,43 @@ SELECT CAST(0x54694442 AS CHAR);
1 row in set (0.0002 sec)
```

以下语句将从 JSON 列中提取的 `a` 属性的值转换为无符号数组。需要注意的是,该函数只有作为多值索引定义的一部分时,才支持将数据转换为数组。

```sql
CREATE TABLE t (
id INT PRIMARY KEY,
j JSON,
INDEX idx_a ((CAST(j->'$.a' AS UNSIGNED ARRAY)))
);
INSERT INTO t VALUES (1, JSON_OBJECT('a',JSON_ARRAY(1,2,3)));
INSERT INTO t VALUES (2, JSON_OBJECT('a',JSON_ARRAY(4,5,6)));
INSERT INTO t VALUES (3, JSON_OBJECT('a',JSON_ARRAY(7,8,9)));
ANALYZE TABLE t;
```

```sql
EXPLAIN SELECT * FROM t WHERE 1 MEMBER OF(j->'$.a')\G
*************************** 1. row ***************************
id: IndexMerge_10
estRows: 2.00
task: root
access object:
operator info: type: union
*************************** 2. row ***************************
id: ├─IndexRangeScan_8(Build)
estRows: 2.00
task: cop[tikv]
access object: table:t, index:idx_a(cast(json_extract(`j`, _utf8mb4'$.a') as unsigned array))
operator info: range:[1,1], keep order:false, stats:partial[j:unInitialized]
*************************** 3. row ***************************
id: └─TableRowIDScan_9(Probe)
estRows: 2.00
task: cop[tikv]
access object: table:t
operator info: keep order:false, stats:partial[j:unInitialized]
3 rows in set (0.00 sec)
```

## CONVERT

[`CONVERT()`](https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_convert) 函数用于在[字符集](/character-set-and-collation.md)之间进行转换。
Expand Down
2 changes: 1 addition & 1 deletion sql-statements/sql-statement-create-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -256,7 +256,7 @@ SELECT MIN(col1) FROM t GROUP BY LOWER(col1);

### 创建多值索引

创建多值索引与创建表达式索引的方法一致。在索引定义中使用 [`CAST(... AS ... ARRAY)`](/functions-and-operators/cast-functions-and-operators.md) 表达式来创建一个多值索引
创建多值索引与创建表达式索引的方法一致。在索引定义中使用 [`CAST(... AS ... ARRAY)`](/functions-and-operators/cast-functions-and-operators.md#cast) 函数来创建一个多值索引

```sql
mysql> CREATE TABLE customers (
Expand Down

0 comments on commit e2d064b

Please sign in to comment.