全部产品

Hint简介

更新时间:2020-08-18 09:29:23

本文适用于PolarDB-X 5.3 及以上版本,其他版本请参见PolarDB-X 5.2 HINT

HINT 作为一种 SQL 补充语法,在关系型数据库中扮演着非常重要的角色。它允许用户通过相关的语法影响 SQL 的执行方式,对 SQL 进行特殊的优化。同样,PolarDB-X 也提供了特殊的 HINT 语法。

例如,假设已知目标数据在某些分库的分表中,需要直接将 SQL 下发到该分库执行,就可以使用 PolarDB-X 自定义 HINT 来完成。

  1. SELECT /*+TDDL:node('node_name')*/ * FROM table_name;

这个 SQL 语句中/**/之间的语句就是 PolarDB-X 的自定义 HINT,即+TDDL:node('node_name'),它指定了 SQL 语句在特定的 RDS 分库上执行。

注意:

  • PolarDB-X 自定义 HINT 支持 /*+TDDL:hint_command*//!+TDDL:hint_command*/ 两种格式。

  • 如果使用 /*+TDDL:hint_command*/ 格式,在使用 MySQL 官方命令行客户端执行带有 PolarDB-X 自定义 HINT 的 SQL 时,请在登录命令中加上 -c 参数。否则,由于 PolarDB-X 自定义 HINT 是以 MySQL 注释 形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致 PolarDB-X 自定义 HINT 失效。详情请参见MySQL 官方客户端命令

PolarDB-X 自定义 HINT 语法

基本语法:

  1. /*+TDDL: hint_command [hint_command ...]*/
  2. /!+TDDL: hint_command [hint_command ...]*/

PolarDB-X 自定义 HINT 基于MySQL注释,HINT语句支持/* hint *//! hint */两种格式,并且必须以+TDDL:开头。其中 hint_command 是 PolarDB-X 自定义 HINT 命令,与具体的操作相关, 多个 hint_command 之间使用空格分割。

例子:

  1. # 查询每个分库中的物理表名
  2. /*+TDDL:scan()*/SHOW TABLES;
  3. # 将查询下发到 RDS 只读实例的 0000 分库上
  4. /*+TDDL:node(0) slave()*/SELECT * FROM t1;

例子中 /*+TDDL:scan()*//*+TDDL:node(0) slave()*/ 为 PolarDB-X 自定义 HINT 部分,以+TDDL:开头。scan()node(0)slave() 为 PolarDB-X 自定义 HINT 命令,多个 HINT 命令之间使用空格分割。

在 SQL 语句中使用 HINT:

PolarDB-X 支持在 DML、DDL、DAL 语句中使用 HINT,具体语法如下:

  • 对于所有支持 HINT 的语句,允许在语句前指定 HINT,如

    1. /*+TDDL: ... */ SELECT ...
    2. /*+TDDL: ... */ INSERT ...
    3. /*+TDDL: ... */ REPLACE ...
    4. /*+TDDL: ... */ UPDATE ...
    5. /*+TDDL: ... */ DELETE ...
    6. /*+TDDL: ... */ CREATE TABLE ...
    7. /*+TDDL: ... */ ALTER TABLE ...
    8. /*+TDDL: ... */ DROP TABLE ...
    9. /*+TDDL: ... */ SHOW ...
    10. ...
  • 对于 DML 语句,允许在首个关键字之后指定 HINT,如

    1. SELECT /*+TDDL: ... */ ...
    2. INSERT /*+TDDL: ... */ ...
    3. REPLACE /*+TDDL: ... */ ...
    4. UPDATE /*+TDDL: ... */ ...
    5. DELETE /*+TDDL: ... */ ...
    6. ...

不同 HINT 支持的语句范围可能不同,实际支持情况请参见具体HINT命令说明。

使用多个 HINT:

PolarDB-X 支持在 HINT 语句中使用多个 HINT 命令

  1. SELECT /*+TDDL:node(0) slave()*/ ...;

PolarDB-X 不支持通过以下方式使用多个 HINT 命令

  1. # 不支持 单条 SQL 语句中包含多个 HINT 语句
  2. SELECT /*+TDDL:node(0)*/ /*+TDDL:slave()*/ ...;
  3. # 不支持 HINT 语句中 包含重复的 HINT 命令
  4. SELECT /*+TDDL:node(0) node(1)*/ ...;

PolarDB-X 自定义 HINT 分类

根据操作类型的不同,PolarDB-X 的自定义 HINT 主要可以分为以下几类:

PolarDB-X 自定义 HINT 兼容性

PolarDB-X 5.3 及以上版本,向下兼容大部分PolarDB-X 5.2 自定义 HINT,详细对照关系如下

PolarDB-X 5.2 HINT 支持情况 对应的 PolarDB-X 5.3 HINT
读写分离 支持 5.2 HINT 语法 读写分离
备库延迟切断 不支持,添加后不产生效果
自定义 SQL 超时时间 支持 5.2 HINT 语法 自定义 SQL 超时时间
指定分库执行 SQL 部分支持, 通过分库键值指定 SQL 在分库上执行迁移至 扫描全部分库分表 指定分库执行 SQL
扫描全部分库分表 支持,增加根据条件计算物理表名称和显式指定物理表名功能 扫描全部分库分表