自定义HINT概要
HINT 作为一种 SQL 补充语法,在关系型数据库中扮演着非常重要的角色。它允许用户通过相关的语法影响 SQL 的执行方式,对 SQL 进行特殊的优化。同样,PolarDB-X 也提供了特殊的 HINT 语法。
例如,假设已知目标数据在某些分库的分表中,需要直接将 SQL 下发到该分库执行,就可以使用PolarDB-X自定义 HINT 来完成。
SELECT /*+TDDL:node('node_name')*/ * FROM table_name;
这个 SQL 语句中/*
和*/
之间的语句就是 PolarDB-X 的自定义 HINT,即+TDDL:node('node_name')
,它指定了 SQL 语句在特定的 RDS 分库上执行。
本文适用于PolarDB-X 5.3 及以上版本,其他版本请参见PolarDB-X 5.2 HINT 简介。
注意事项
- 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 语法
基本语法:
/*+TDDL: hint_command [hint_command ...]*/
/!+TDDL: hint_command [hint_command ...]*/
PolarDB-X 自定义 HINT 基于MySQL 注释,HINT语句支持/* hint */
和/! hint */
两种格式,并且必须以+TDDL:
开头。其中 hint_command
是 PolarDB-X 自定义 HINT 命令,与具体的操作相关,多个 hint_command
之间使用空格分割。
例子:
# 查询每个分库中的物理表名
/*+TDDL:scan()*/SHOW TABLES;
# 将查询下发到 RDS 只读实例的 0000 分库上
/*+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,如
/*+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:
PolarDB-X 支持在 HINT 语句中使用多个 HINT 命令
SELECT /*+TDDL:node(0) slave()*/ ...;
PolarDB-X 不支持通过以下方式使用多个 HINT 命令
# 不支持 单条 SQL 语句中包含多个 HINT 语句
SELECT /*+TDDL:node(0)*/ /*+TDDL:slave()*/ ...;
# 不支持 HINT 语句中 包含重复的 HINT 命令
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 语法 | 5.3 读写分离 |
备库延迟切断 | 不支持,添加后不产生效果 | 无 |
自定义 SQL 超时时间 | 支持 5.2 HINT 语法 | 自定义 SQL 超时时间 |
指定分库执行 SQL | 部分支持, “通过分库键值指定 SQL 在分库上执行” 迁移至 扫描全部分库分表 | 指定分库执行 SQL |
扫描全部分库分表 | 支持,增加 “根据条件计算物理表名称” 和 “显式指定物理表名” 功能 | 扫描全部分库分表 |