Aurora MySQL のヒント - Amazon Aurora

Aurora MySQL のヒント

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

ヒント

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

Aurora MySQL バージョン 3 では、MySQL Community Edition 8.0 で利用可能なすべてのヒントを使用できます。これらのヒントの詳細については、MySQL リファレンスマニュアルの「オプティマイザヒント」を参照してください。

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

PQ、NO_PQ

オプティマイザが、テーブル単位またはクエリ単位、どちらのパラレルクエリを使用するかを指定します。

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_JOIN、NO_HASH_JOIN

クエリにハッシュ結合最適化メソッドを使用するかどうかを選択するパラレルクエリオプティマイザの機能をオンまたはオフにします。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_JOIN_PROBING、NO_HASH_JOIN_PROBING

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

以下の例では、このヒントの使用方法を示します。テーブル HASH_JOIN_PROBINGT2 ヒントを指定することは、テーブル NO_HASH_JOIN_PROBINGT1 を指定するのと同じ効果があります。

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_JOIN_BUILDING、NO_HASH_JOIN_BUILDING

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

以下の例では、このヒントの使用方法を示します。テーブル HASH_JOIN_BUILDINGT2 ヒントを指定することは、テーブル NO_HASH_JOIN_BUILDINGT1 を指定するのと同じ効果があります。

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_FIXED_ORDER

クエリ内のテーブルが、クエリにリストされている順序に基づいて結合されるように指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。これは、MySQL STRAIGHT_JOIN の代替となることを目的とし、MySQL JOIN_FIXED_ORDER ヒントに相当します。このヒントは、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_ORDER

クエリ内のテーブルの結合順序を指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL JOIN_ORDER ヒントに相当します。このヒントは、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_PREFIX

結合順序の先頭に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL JOIN_PREFIX ヒントに相当します。このヒントは、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_SUFFIX

結合順で最後に配置するテーブルを指定します。これは、3 つ以上のテーブルを含むクエリで特に便利です。MySQL JOIN_SUFFIX ヒントに相当します。このヒントは、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 結合クエリの最適化」を参照してください。