本文介绍了自定义HINT的用途以及基本语法。

本文适用于DRDS 5.3及以上版本。

简介

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

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

DRDS自定义HINT语法

语法

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

注意事项

  • DRDS自定义HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/两种格式。
  • HINT语句位于/**//!*/之间,并且必须以+TDDL:开头。其中hint_commandDRDS自定义HINT命令,与具体的操作相关,多个hint_command之间使用空格分割。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客户端执行带有DRDS自定义HINT的SQL时,请在登录命令中加上-c 参数。否则,由于DRDS自定义HINT是以MySQL 注释形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致DRDS自定义HINT失效。具体请查看MySQL 官方客户端命令

示例

# 查询每个分库中的物理表名
/*+TDDL:scan()*/SHOW TABLES;

# 将查询下发到RDS只读实例的0000分库上
/*+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,例如:
    /*+TDDL: ... */ SELECT ...
    /*+TDDL: ... */ INSERT ...
    /*+TDDL: ... */ REPLACE ...
    /*+TDDL: ... */ UPDATE ...
    /*+TDDL: ... */ DELETE ...
    /*+TDDL: ... */ CREATE TABLE ...
    /*+TDDL: ... */ ALTER TABLE ...
    /*+TDDL: ... */ DROP TABLE ...
    /*+TDDL: ... */ SHOW ...
    ...
                
  • 对于DML语句,允许在首个关键字之后指定HINT,例如:
    SELECT /*+TDDL: ... */  ...
    INSERT /*+TDDL: ... */  ...
    REPLACE /*+TDDL: ... */  ...
    UPDATE /*+TDDL: ... */  ...
    DELETE /*+TDDL: ... */  ...
    ...
                
    说明 不同HINT支持的语句范围可能不同,实际支持情况请参考具体HINT命令说明文档。

使用多个HINT

DRDS支持在HINT语句中使用多个HINT命令,例如:

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

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

# 不支持单条SQL语句中包含多个HINT语句
SELECT /*+TDDL:node(0)*/ /*+TDDL:slave()*/ ...;

# 不支持HINT语句中包含重复的HINT命令
SELECT /*+TDDL:node(0) node(1)*/ ...;      

DRDS自定义HINT分类