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

PolarDB-X 1.0自定義HINT分類