本文介紹了自定義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)*/ ...;