全部产品
云市场

HINT 简介

更新时间:2018-12-21 10:38:04

DRDS 自定义 HINT 概要

本文适用于 DRDS 5.3 及以上版本,其他版本请参考DRDS 5.2 HINT 文档

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

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

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

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

注意:

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

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

DRDS 自定义 HINT 语法

基本语法:

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

DRDS 自定义 HINT 基于MySQL 注释,HINT 语句位于 /**//!*/ 之间,并且必须以+TDDL:开头。其中 hint_command 是 DRDS 自定义 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()*/ 为 DRDS 自定义 HINT 部分,以+TDDL:开头。scan()node(0)slave() 为 DRDS 自定义 HINT 命令,多个 HINT 命令之间使用空格分割。

在 SQL 语句中使用 HINT:

DRDS 支持在 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:

DRDS 支持在 HINT 语句中使用多个 HINT 命令

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

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

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

DRDS 自定义 HINT 分类

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

DRDS 自定义 HINT 兼容性

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

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