本文介紹了自訂HINT的用途以及基本文法。
本文適用於PolarDB-X 1.0 5.3及以上版本。
簡介
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)*/ ...;