Aurora MySQL 提示 - Amazon Aurora

Aurora MySQL 提示

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

提示

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

在 Aurora MySQL 版本 3 中,您可以使用 MySQL 社群版 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_PROBINGHASH_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_JOIN_BUILDING、NO_HASH_JOIN_BUILDING

在哈希联接查询中,指定是否将指定的表用于联接的构建端。查询处理此表中的所有行来构建列值列表,以便与其他表进行交叉引用。您可以使用 HASH_JOIN_PROBINGHASH_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_FIXED_ORDER

指定查询中的表按它们在查询中的列出顺序进行联接。它对于涉及三个或更多表的查询很有用。它旨在替代 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

指定查询中表的联接顺序。它对于涉及三个或更多表的查询很有用。它等效于 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

指定联接顺序中首先放置的表。它对于涉及三个或更多表的查询很有用。它等效于 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

指定联接顺序中最后放置的表。它对于涉及三个或更多表的查询很有用。它等效于 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 联接查询