一般情况下,优化器会为用户查询选择最佳的执行计划,不需要用户使用 Hint 指定。但在某些场景下,优化器生成的执行计划可能不满足用户的要求,这时就需要用户使用 Hint 来指定生成某种执行计划。 
 
  Hint 从语法上看是一种特殊的 SQL 注释,所不同的是在注释的左标记后("/*"符号)增加了一个"+"。 既然是注释,如果服务器端无法识别 SQL 语句中的 Hint,优化器会选择忽略用户 Hint 而使用默认的计划生成逻辑结构。另外,Hint 只影响优化器生成计划的逻辑结构,而不影响 SQL 语句的语义。 
 
  { DELETE | INSERT | SELECT | UPDATE | REPLACE } /*+ [hint_text][,hint_text]... */ 
 
  注意: 
 
  1.  如果使用 MySQL 的 C 客户端执行带 Hint 的 SQL 语句,需要使用 -c 选项登录,否则 MySQL 客户端会将 Hint 作为注释从用户 SQL 语句中去除,导致系统无法收到用户 Hint。 
 
  2.  在 SQL 语句中,表名存在别名即 table_name [AS] alias ,必须写表别名,才能使 INDEX 生效。 
 
Hint 相关参数名称、语义和语法如下表所示。
| 名称 | 语法 | 语义 | 
|---|---|---|
| NO_REWRITE | NO_REWRITE | 禁止 SQL 改写。 | 
| READ_CONSISTENCY | READ_CONSISTENCY (WEAK[STRONGFROZEN]) | 读一致性设置(弱/强)。 | 
| INDEX_HINT | /*+ INDEX(table_name index_name) */ | 设置表索引。 | 
| QUERY_TIMEOUT | QUERY_TIMEOUT(INTNUM) | 设置超时时间。 | 
| LOG_LEVEL | LOG_LEVEL([']log_level[']) | 设置日志级别,当设置模块级别语句时候,以第一个单引号(')作为开始,第二个单引号(')作为结束;例如'DEBUG'。 | 
| LEADING | LEADING([qb_name] TBL_NAME_LIST) | 设置联接顺序。 | 
| ORDERED | ORDERED | 设置按照 SQL 中的顺序进行联接。 | 
| FULL | FULL([qb_name] TBL_NAME) | 设置表访问路径为主表等价于 INDEX(TBL_NAME PRIMARY)。 |  
    
| USE_PLAN_CACHE | USE_PLAN_CACHE(NONE[DEFAULT]) | 设置是否使用计划缓存: | 
| USE_MERGE | USE_MERGE([qb_name] TBL_NAME_LIST) | 设置指定表在作为右表时使用 Merge Join。 | 
| USE_HASH | USE_HASH([qb_name] TBL_NAME_LIST) | 设置指定表在作为右表时使用 Hash Join。 | 
| NO_USE_HASH | NO_USE_HASH([qb_name] TBL_NAME_LIST) | 设置指定表在作为右表时不使用 Hash Join。 | 
| USE_NL | USE_NL([qb_name] TBL_NAME_LIST) | 设置指定表在作为右表时使用 Nested Loop Join。 | 
| USE_BNL | USE_BNL([qb_name] TBL_NAME_LIST) | 设置指定表在作为右表时使用 Block Nested Loop Join | 
| USE_HASH_AGGREGATION | USE_HASH_AGGREGATION([qb_name]) | 设置聚合算法为 Hash。例如 Hash Group By 或者 Hash Distinct。 | 
| NO_USE_HASH_AGGREGATION | NO_USE_HASH_AGGREGATION([qb_name]) | 设置 Aggregate 方法不使用 Hash Aggregate,使用 Merge Group By 或者 Merge Distinct。 | 
| USE_LATE_MATERIALIZATION | USE_LATE_MATERIALIZATION | 设置使用晚期物化。 | 
| NO_USE_LATE_MATERIALIZATION | NO_USE_LATE_MATERIALIZATION | 设置不使用晚期物化。 | 
| TRACE_LOG | TRACE_LOG | 设置收集 Trace 记录用于 SHOW TRACE 展示。 |  
    
| QB_NAME | QB_NAME( NAME ) | 设置 Query Block 的名称。 | 
| PARALLEL | PARALLEL(INTNUM) | 设置分布式执行并行度。 | 
| TOPK | TOPK(PRECISION MINIMUM_ROWS) | 设置模糊查询的精度和最小行数。 其中 PRECSION 为整型,取值范围[0,100],表示模糊查询的行数百分比;MINIMUM_ROWS 为最小返回行数。 |  
    

					
					
				
			

