天天看點

PolarDB-X 1.0-SQL 手冊-Hint--Hint簡介

本文适用于PolarDB-X 5.3 及以上版本,其他版本請參見 PolarDB-X 5.2 HINT

HINT 作為一種 SQL 補充文法,在關系型資料庫中扮演着非常重要的角色。它允許使用者通過相關的文法影響 SQL 的執行方式,對 SQL 進行特殊的優化。同樣,PolarDB-X 也提供了特殊的 HINT 文法。

例如,假設已知目标資料在某些分庫的分表中,需要直接将 SQL 下發到該分庫執行,就可以使用 PolarDB-X 自定義 HINT 來完成。

  1. SELECT /*+TDDL:node('node_name')*/ * FROM table_name;

這個 SQL 語句中

/*

*/

之間的語句就是 PolarDB-X 的自定義 HINT,即

+TDDL:node('node_name')

,它指定了 SQL 語句在特定的 RDS 分庫上執行。

注意:

  • 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 文法

基本文法:

  1. /*+TDDL: hint_command [hint_command ...]*/

  2. /!+TDDL: hint_command [hint_command ...]*/

PolarDB-X 自定義 HINT 基于

MySQL注釋

,HINT語句支援

/* hint */

/! hint */

兩種格式,并且必須以

+TDDL:

開頭。其中

hint_command

是 PolarDB-X 自定義 HINT 指令,與具體的操作相關, 多個

hint_command

之間使用空格分割。

例子:

  1. # 查詢每個分庫中的實體表名

  2. /*+TDDL:scan()*/SHOW TABLES;

  3. # 将查詢下發到 RDS 隻讀執行個體的 0000 分庫上

  4. /*+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,如
    1. /*+TDDL: ... */ SELECT ...

    2. /*+TDDL: ... */ INSERT ...

    3. /*+TDDL: ... */ REPLACE ...

    4. /*+TDDL: ... */ UPDATE ...

    5. /*+TDDL: ... */ DELETE ...

    6. /*+TDDL: ... */ CREATE TABLE ...

    7. /*+TDDL: ... */ ALTER TABLE ...

    8. /*+TDDL: ... */ DROP TABLE ...

    9. /*+TDDL: ... */ SHOW ...

    10. ...

  • 對于 DML 語句,允許在首個關鍵字之後指定 HINT,如
    1. SELECT /*+TDDL: ... */ ...

    2. INSERT /*+TDDL: ... */ ...

    3. REPLACE /*+TDDL: ... */ ...

    4. UPDATE /*+TDDL: ... */ ...

    5. DELETE /*+TDDL: ... */ ...

    6. ...

不同 HINT 支援的語句範圍可能不同,實際支援情況請參見具體HINT指令說明。

使用多個 HINT:

PolarDB-X 支援在 HINT 語句中使用多個 HINT 指令

  1. SELECT /*+TDDL:node(0) slave()*/ ...;

PolarDB-X 不支援通過以下方式使用多個 HINT 指令

  1. # 不支援 單條 SQL 語句中包含多個 HINT 語句

  2. SELECT /*+TDDL:node(0)*/ /*+TDDL:slave()*/ ...;

  3. # 不支援 HINT 語句中 包含重複的 HINT 指令

  4. 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.3 HINT
支援 5.2 HINT 文法
備庫延遲切斷 不支援,添加後不産生效果
部分支援, 通過分庫鍵值指定 SQL 在分庫上執行遷移至
支援,增加根據條件計算實體表名稱和顯式指定實體表名功能