

# Aurora MySQL のヒント
<a name="AuroraMySQL.Reference.Hints"></a><a name="hints"></a>

Aurora MySQL クエリで SQL ヒントを使用して、パフォーマンスを微調整できます。ヒントを使用して、重要なクエリの実行計画が予測不可能な条件のために変更されないようにすることもできます。

**ヒント**  
ヒントがクエリに与える影響を確認するには、`EXPLAIN` ステートメントによって生成されるクエリプランを調べます。ヒントの有無にかかわらず、クエリプランを比較します。

Aurora MySQL バージョン 3 では、MySQL Community Edition 8.0 で利用可能なすべてのヒントを使用できます。これらのヒントの詳細については、*MySQL リファレンスマニュアル*の「[オプティマイザヒント](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html)」を参照してください。

これらのヒントは、Aurora MySQL バージョン 2 で使用可能です。これらのヒントは、Aurora MySQL バージョン 2 のハッシュ結合特徴を使用するクエリ、特にパラレルクエリ最適化を使用するクエリに適用されます。

**PQ、NO\$1PQ**  
オプティマイザが、テーブル単位またはクエリ単位、どちらのパラレルクエリを使用するかを指定します。  
`PQ` は、指定されたテーブルまたはクエリ全体 (ブロック) に対して、オプティマイザがパラレルクエリを使用するよう強制します。`NO_PQ` は、指定されたテーブルまたはクエリ全体 (ブロック) に対して、オプティマイザがパラレルクエリを使用しないようにします。  
このヒントは、Aurora MySQL バージョン 2.11 以降で使用可能です。以下の例では、このヒントの使用方法を示します。  
テーブル名を指定した場合、オプティマイザは選択したテーブルにのみ `PQ/NO_PQ` ヒントを適用するようになります。テーブル名を指定しない場合、クエリブロックの影響を受けるすべてのテーブルに `PQ/NO_PQ` ヒントが強制されます。

```
EXPLAIN SELECT /*+ PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;

EXPLAIN SELECT /*+ NO_PQ() */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1) */ f1, f2
    FROM num1 t1 WHERE f1 > 10 and f2 < 100;

EXPLAIN SELECT /*+ NO_PQ(t1,t2) */ f1, f2
    FROM num1 t1, num1 t2 WHERE t1.f1 = t2.f21;
```

**HASH\$1JOIN、NO\$1HASH\$1JOIN**  
クエリにハッシュ結合最適化メソッドを使用するかどうかを選択するパラレルクエリオプティマイザの機能をオンまたはオフにします。`HASH_JOIN` は、そのメカニズムがより効率的である場合、オプティマイザがハッシュ結合を使用できるようにします。`NO_HASH_JOIN` は、オプティマイザがクエリにハッシュ結合を使用できないようにします。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT/*+ HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ NO_HASH_JOIN(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1PROBING、NO\$1HASH\$1JOIN\$1PROBING**  
ハッシュ結合クエリで、結合のプローブ側に指定されたテーブルを使用するかどうかを指定します。クエリは、プローブテーブルの内容全体を読み取る代わりに、構築テーブルの列値がプローブテーブルに存在するかどうかをテストします。`HASH_JOIN_PROBING` および `HASH_JOIN_BUILDING` を使用して、クエリテキスト内のテーブルを並べ替えることなく、ハッシュ結合クエリの処理方法を指定できます。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。テーブル `HASH_JOIN_PROBING` の `T2` ヒントを指定することは、テーブル `NO_HASH_JOIN_PROBING` に `T1` を指定するのと同じ効果があります。  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_PROBING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_PROBING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**HASH\$1JOIN\$1BUILDING、NO\$1HASH\$1JOIN\$1BUILDING**  
ハッシュ結合クエリで、結合の構築側に指定されたテーブルを使用するかどうかを指定します。クエリは、このテーブルのすべての行を処理し、他のテーブルと相互参照する列値のリストを作成します。`HASH_JOIN_PROBING` および `HASH_JOIN_BUILDING` を使用して、クエリテキスト内のテーブルを並べ替えることなく、ハッシュ結合クエリの処理方法を指定できます。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。Aurora MySQL バージョン 3 では効果がありません。  
以下の例では、このヒントの使用方法を示します。テーブル `HASH_JOIN_BUILDING` の `T2` ヒントを指定することは、テーブル `NO_HASH_JOIN_BUILDING` に `T1` を指定するのと同じ効果があります。  

```
EXPLAIN SELECT /*+ HASH_JOIN(t2) HASH_JOIN_BUILDING(t2) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;

EXPLAIN SELECT /*+ HASH_JOIN(t2) NO_HASH_JOIN_BUILDING(t1) */ f1, f2
  FROM t1, t2 WHERE t1.f1 = t2.f1;
```

**JOIN\$1FIXED\$1ORDER**  
クエリ内のテーブルが、クエリにリストされている順序に基づいて結合されるように指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。これは、MySQL `STRAIGHT_JOIN` の代替となることを目的とし、MySQL [JOIN\$1FIXED\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_FIXED_ORDER() */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1ORDER**  
クエリ内のテーブルの結合順序を指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1ORDER](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_ORDER (t4, t2, t1, t3) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1PREFIX**  
結合順序の先頭に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1PREFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_PREFIX (t4, t2) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

**JOIN\$1SUFFIX**  
結合順で最後に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL [JOIN\$1SUFFIX](https://dev.mysql.com/doc/refman/8.0/en/optimizer-hints.html) ヒントに相当します。このヒントは、Aurora MySQL バージョン 2.08 以降で使用可能です。  
以下の例では、このヒントの使用方法を示します。  

```
EXPLAIN SELECT /*+ JOIN_SUFFIX (t1) */ f1, f2
  FROM t1 JOIN t2 USING (id) JOIN t3 USING (id) JOIN t4 USING (id);
```

ハッシュ結合クエリの使用方法については、「[ハッシュ結合を使用した大規模な Aurora MySQL 結合クエリの最適化](AuroraMySQL.BestPractices.Performance.md#Aurora.BestPractices.HashJoin)」を参照してください。