本文介绍了自定义HINT的用途以及基本语法。
本文适用于PolarDB-X 1.0 5.3及以上版本,其他版本请参见如何使用HINT(5.2及以下版本适用)
简介
HINT作为一种SQL补充语法,在关系型数据库中扮演着非常重要的角色。它允许用户通过相关的语法影响SQL的执行方式,对SQL进行特殊的优化。
PolarDB-X 1.0也提供了特殊的HINT语法。例如已知目标数据在某些分库的分表中,需要直接将SQL下发到该分库执行,就可以使用PolarDB-X 1.0自定义HINT来完成。
PolarDB-X 1.0自定义HINT语法
语法
/*+TDDL: hint_command [hint_command ...]*/
/!+TDDL: hint_command [hint_command ...]*/
注意事项
- PolarDB-X 1.0自定义HINT支持
/*+TDDL:hint_command*/
和/!+TDDL:hint_command*/
两种格式。 - HINT语句位于
/*
与*/
或/!
与*/
之间,并且必须以+TDDL:
开头。其中hint_command
是PolarDB-X 1.0自定义HINT命令,与具体的操作相关,多个hint_command
之间使用空格分割。 - 如果使用
/*+TDDL:hint_command*/
格式,在使用MySQL官方命令行客户端执行带有PolarDB-X 1.0自定义HINT的SQL时,请在登录命令中加上-c
参数。否则,由于PolarDB-X 1.0自定义HINT是以MySQL 注释形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致PolarDB-X 1.0自定义HINT失效。具体请查看MySQL 官方客户端命令。
示例
# 查询每个分库中的物理表名
/*+TDDL:scan()*/SHOW TABLES;
# 将查询下发到RDS只读实例的0000分库上
/*+TDDL:node(0) slave()*/SELECT * FROM t1;
示例中/*+TDDL:scan()*/
和/*+TDDL:node(0) slave()*/
为PolarDB-X 1.0自定义HINT部分,以+TDDL:
开头。scan()
、node(0)
、slave()
为PolarDB-X 1.0自定义HINT命令,多个HINT命令之间使用空格分割。
在SQL语句中使用HINT
PolarDB-X 1.0支持在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
PolarDB-X 1.0支持在HINT语句中使用多个HINT命令,例如:
SELECT /*+TDDL:node(0) slave()*/ ...;
PolarDB-X 1.0不支持通过以下方式使用多个HINT命令:
# 不支持单条SQL语句中包含多个HINT语句
SELECT /*+TDDL:node(0)*/ /*+TDDL:slave()*/ ...;
# 不支持HINT语句中包含重复的HINT命令
SELECT /*+TDDL:node(0) node(1)*/ ...;