

# Aurora MySQL 提示
<a name="AuroraMySQL.Reference.Hints"></a><a name="hints"></a>

您可以将 SQL 提示与 Aurora MySQL 查询结合使用来微调性能。您还可以使用提示来防止重要查询的执行计划由于不可预知的条件而发生变化。

**提示**  
要验证提示对查询的影响，请查看 `EXPLAIN` 语句生成的查询计划。比较包含和不包含提示的查询计划。

在 Aurora MySQL 版本 3 中，您可以使用 MySQL 社群版 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**  
指定查询中的表按它们在查询中的列出顺序进行联接。它对于涉及三个或更多表的查询很有用。它旨在替代 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**  
指定查询中表的联接顺序。它对于涉及三个或更多表的查询很有用。它等效于 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**  
指定联接顺序中首先放置的表。它对于涉及三个或更多表的查询很有用。它等效于 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**  
指定联接顺序中最后放置的表。它对于涉及三个或更多表的查询很有用。它等效于 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)。