Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions choose-index.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ summary: TiDBクエリ最適化に最適なインデックスを選択してく
| TableReader | テーブルはTiFlashノード上に複製されます。 | 読み込む列の数は少ないが、評価する行の数は多い。 | この TableReader 演算子はTiFlash用です。TiFlashは列ベースのストレージです。列数が少なく行数が多い場合、この演算子を選択することをお勧めします。 |
| IndexReader | テーブルには1つ以上のインデックスがあり、計算に必要な列はインデックスに含まれています。 | インデックスに対してより狭い範囲のクエリを実行する場合、またはインデックス付き列に順序要件がある場合。 | 複数の指標が存在する場合は、コスト見積もりに基づいて適切な指標が選択されます。 |
| IndexLookupReader | テーブルには1つ以上のインデックスがあり、計算に必要な列がインデックスに完全に含まれていない。 | IndexReaderと同じです。 | インデックスは計算列を完全にカバーしていないため、TiDBはインデックスを読み取った後にテーブルから行を取得する必要があります。これはIndexReaderオペレーターと比較して追加のコストがかかります。 |
| IndexMerge | テーブルには複数のインデックス、または複数値インデックスが存在する。 | 複数値インデックスまたは複数のインデックスが使用される場合。 | 演算子を使用するには、[オプティマイザのヒント](/optimizer-hints.md)を指定するか、コスト見積もりに基づいてオプティマイザにこの演算子を自動的に選択させることができます。詳細については、[インデックスマージを使用した説明文](/explain-index-merge.md)を参照してください。 |
| IndexMerge | テーブルには複数のインデックス、または多値インデックスが存在する。 | 多値インデックスまたは複数のインデックスが使用される場合。 | 演算子を使用するには、[オプティマイザのヒント](/optimizer-hints.md)を指定するか、コスト見積もりに基づいてオプティマイザにこの演算子を自動的に選択させることができます。詳細については、[インデックスマージを使用した説明文](/explain-index-merge.md)を参照してください。 |

> **注記:**
>
Expand Down Expand Up @@ -143,15 +143,15 @@ mysql> SHOW WARNINGS;

- `READ_FROM_STORAGE`オプティマイザに特定のテーブルに対してクエリを実行するために TiKV / TiFlashストレージエンジンを選択するように強制できます。

## 複数値インデックスを使用する {#use-multi-valued-indexes}
## 多値インデックスを使用する {#use-multi-valued-indexes}

[多値インデックス](/sql-statements/sql-statement-create-index.md#multi-valued-indexes)は通常のインデックスとは異なります。 TiDB は現在、複数値のインデックスにアクセスするために[インデックスマージ](/explain-index-merge.md)のみを使用します。したがって、データ アクセスに複数値インデックスを使用するには、システム変数[`tidb_enable_index_merge`](/system-variables.md#tidb_enable_index_merge-new-in-v40)の値が`ON`に設定されていることを確認してください。
[多値インデックス](/sql-statements/sql-statement-create-index.md#multi-valued-indexes)は通常のインデックスとは異なります。 TiDB は現在、多値インデックスにアクセスするために[インデックスマージ](/explain-index-merge.md)のみを使用します。したがって、データ アクセスに多値インデックスを使用するには、システム変数[`tidb_enable_index_merge`](/system-variables.md#tidb_enable_index_merge-new-in-v40)の値が`ON`に設定されていることを確認してください。

複数値インデックスの制限事項については、 [`CREATE INDEX`](/sql-statements/sql-statement-create-index.md#limitations)を参照してください。
多値インデックスの制限事項については、 [`CREATE INDEX`](/sql-statements/sql-statement-create-index.md#limitations)を参照してください。

### サポートされているシナリオ {#supported-scenarios}

現在、TiDB は`json_member_of``json_contains` E}} 、 `json_overlaps`の条件から自動的に変換される IndexMerge を使用して、複数値インデックスへのアクセスをサポートしています。オプティマイザがコストに基づいて IndexMerge を自動的に選択するようにするか、オプティマイザヒント[`use_index_merge`](/optimizer-hints.md#use_index_merget1_name-idx1_name--idx2_name-)または[`use_index`](/optimizer-hints.md#use_indext1_name-idx1_name--idx2_name-)を使用して複数値インデックスの選択を指定できます。以下の例を参照してください。
現在、TiDB は`json_member_of``json_contains``json_overlaps`の条件から自動的に変換される IndexMerge を使用して、多値インデックスへのアクセスをサポートしています。オプティマイザがコストに基づいて IndexMerge を自動的に選択するようにするか、オプティマイザヒント[`use_index_merge`](/optimizer-hints.md#use_index_merget1_name-idx1_name--idx2_name-)または[`use_index`](/optimizer-hints.md#use_indext1_name-idx1_name--idx2_name-)を使用して多値インデックスの選択を指定できます。以下の例を参照してください。

```sql
mysql> CREATE TABLE t1 (j JSON, INDEX idx((CAST(j->'$.path' AS SIGNED ARRAY)))); -- Uses '$.path' as the path to create a multi-valued index
Expand Down Expand Up @@ -248,7 +248,7 @@ EXPLAIN SELECT /*+ use_index_merge(t2, idx, idx2) */ * FROM t2 WHERE (a=1 AND 1
+-------------------------------+---------+-----------+-----------------------------------------------------------------------------------+-----------------------------------------------------+
```

TiDBはIndexMergeを使用して、複数値インデックスと通常のインデックスの両方にアクセスすることもできます。例:
TiDBはIndexMergeを使用して、多値インデックスと通常のインデックスの両方にアクセスすることもできます。例:

```sql
CREATE TABLE t3(j1 JSON, j2 JSON, a INT, INDEX k1((CAST(j1->'$.path' AS SIGNED ARRAY))), INDEX k2((CAST(j2->'$.path' AS SIGNED ARRAY))), INDEX ka(a));
Expand Down Expand Up @@ -279,7 +279,7 @@ EXPLAIN SELECT /*+ use_index_merge(t3, k1, k2, ka) */ * FROM t3 WHERE 1 member o
+-------------------------------+---------+-----------+-----------------------------------------------------------------------------+---------------------------------------------+
```

`json_member_of` 、 `json_contains`または`json_overlaps`の複数の条件が`OR`または`AND`と関連付けられている場合、IndexMergeを使用して複数値インデックスにアクセスするには、以下の要件を満たす必要があります。
`json_member_of` 、 `json_contains`または`json_overlaps`の複数の条件が`OR`または`AND`と関連付けられている場合、IndexMergeを使用して多値インデックスにアクセスするには、以下の要件を満たす必要があります。

```sql
CREATE TABLE t4(a INT, j JSON, INDEX mvi1((CAST(j->'$.a' AS UNSIGNED ARRAY))), INDEX mvi2((CAST(j->'$.b' AS UNSIGNED ARRAY))));
Expand Down Expand Up @@ -325,7 +325,7 @@ CREATE TABLE t4(a INT, j JSON, INDEX mvi1((CAST(j->'$.a' AS UNSIGNED ARRAY))), I
+---------+------+----------------------------+
```

- `AND`に関連する条件については、それぞれ IndexMerge を使用してアクセスできる必要があります。TiDB は、これらの条件を持つマルチ値インデックスへのアクセスに IndexMerge のみを使用できます。例:
- `AND`に関連する条件については、それぞれ IndexMerge を使用してアクセスできる必要があります。TiDB は、これらの条件を持つ多値インデックスへのアクセスに IndexMerge のみを使用できます。例:

```sql
EXPLAIN SELECT /*+ use_index_merge(t4, mvi1) */ * FROM t4 WHERE json_contains(j->'$.a', '[1, 2]') AND json_contains(j->'$.a', '[3, 4]');
Expand Down Expand Up @@ -599,7 +599,7 @@ EXPLAIN SELECT /*+ use_index_merge(t6, idx, idx2) */ * FROM t6 WHERE a=1 AND ((1
+-------------------------------+---------+-----------+-------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

現在のマルチバリューインデックスの実装上の制約により、 [`use_index`](/optimizer-hints.md#use_indext1_name-idx1_name--idx2_name-)を使用すると`Can't find a proper physical plan for this query`エラーが発生する可能性がありますが、 [`use_index_merge`](/optimizer-hints.md#use_index_merget1_name-idx1_name--idx2_name-)使用するとそのようなエラーは発生しません。したがって、マルチバリューインデックスを使用する場合は`use_index_merge`を使用することをお勧めします。
現在の多値インデックスの実装上の制約により、 [`use_index`](/optimizer-hints.md#use_indext1_name-idx1_name--idx2_name-)を使用すると`Can't find a proper physical plan for this query`エラーが発生する可能性がありますが、 [`use_index_merge`](/optimizer-hints.md#use_index_merget1_name-idx1_name--idx2_name-)を使用するとそのようなエラーは発生しません。したがって、多値インデックスを使用する場合は`use_index_merge`を使用することをお勧めします。

```sql
mysql> EXPLAIN SELECT /*+ use_index(t3, idx) */ * FROM t3 WHERE ((1 member of (j)) AND (2 member of (j))) OR ((3 member of (j)) AND (4 member of (j)));
Expand All @@ -616,9 +616,9 @@ mysql> EXPLAIN SELECT /*+ use_index_merge(t3, idx) */ * FROM t3 WHERE ((1 member
3 rows in set, 2 warnings (0.00 sec)
```

### 複数値インデックスとプランキャッシュ {#multi-valued-indexes-and-plan-cache}
### 多値インデックスとプランキャッシュ {#multi-valued-indexes-and-plan-cache}

`member of`を使用して複数値インデックスを選択するクエリプランはキャッシュできます。 `JSON_CONTAINS()`または`JSON_OVERLAPS()`関数を使用して複数値インデックスを選択するクエリプランはキャッシュできません
`member of`を使用して多値インデックスを選択するクエリプランはキャッシュできます。 `JSON_CONTAINS()`または`JSON_OVERLAPS()`関数を使用して多値インデックスを選択するクエリプランはキャッシュできません

クエリプランをキャッシュできる例をいくつか以下に示します。

Expand Down
2 changes: 1 addition & 1 deletion functions-and-operators/cast-functions-and-operators.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ SELECT CAST(0x54694442 AS CHAR);
1 row in set (0.0002 sec)
```

次の文は、JSON列から抽出された`a`の属性の値を符号なし配列にキャストします。配列へのキャストは、複数値インデックスのインデックス定義の一部としてのみサポートされることに注意してください
次の文は、JSON列から抽出された`a`の属性の値を符号なし配列にキャストします。配列へのキャストは、多値インデックスのインデックス定義の一部としてのみサポートされることに注意してください

```sql
CREATE TABLE t (
Expand Down
Loading
Loading