全部產品
Search
文件中心

PolarDB:指定分庫執行SQL

更新時間:Jul 06, 2024

本文介紹了指定分庫執行SQL的HINT文法和樣本。

本文適用於PolarDB-X 1.0 5.3及以上版本。

在使用PolarDB-X 1.0的過程中,如果遇到某個PolarDB-X 1.0不支援的SQL語句,可以通過PolarDB-X 1.0提供的NODE HINT,直接將SQL下發到一個或多個分庫上去執行。此外如果需要單獨查詢某個分庫或者已知分庫的某個分表中的資料,也可以使用NODE HINT,直接將SQL語句下發到分庫中執行。

文法

NODE HINT支援通過分區名指定SQL在分庫上執行。其中分區名是PolarDB-X 1.0中分庫的唯一標識,可以通過SHOW NODE語句得到。

通過分庫名指定SQL在分庫上執行分兩種使用方式,分別是指定SQL在某個分庫上執行和指定SQL在多個分庫上執行。

重要 如果在目標表包含Sequence的INSERT語句上使用了指定分庫的HINT,那麼Sequence將不生效。更多相關資訊,請參考使用限制
  • 指定SQL在某個分庫上執行:

    /*+TDDL:node('node_name')*/            

    node_name為分區名,通過這個PolarDB-X 1.0自訂HINT,就可以將SQL下發到node_name對應的分庫中執行。

  • 指定SQL在多個分庫上執行:

    /*+TDDL:node('node_name'[,'node_name1','node_name2'])*/               

    在參數中指定多個分區名,將SQL下發到多個分庫上執行,分區名之間使用逗號分隔。

    說明
    • 使用該自定HINT 時,PolarDB-X 1.0會將SQL直接下發到分庫上執行,所以在SQL語句中,表名必須是該分庫中已經存在的表名。
    • NODE HINT支援 DML、DDL、DAL語句。

注意事項

  • 從版本5.4.1開始,PolarDB-X 1.0在拆分表的物理表名中增加了4個字元的隨機串,請務必使用SHOW TOPOLOGY命令擷取邏輯表拓撲和實際的物理表名。
  • 從版本5.4.4 開始,PolarDB-X 1.0提供開關來控制拆分表的物理表名中是否包含隨機串,預設為開啟,可以在控制台“參數設定”的資料庫層級參數中,將“是否啟用隨機物理表名 ENABLE_RANDOM_PHY_TABLE_NAME”改為false來關閉,也可以用HINT來實現語句層級的控制:/*+TDDL:cmd_extra(ENABLE_RANDOM_PHY_TABLE_NAME=FALSE)*/
  • PolarDB-X 1.0自訂HINT支援/*+TDDL:hint_command*//!+TDDL: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 官方用戶端命令

樣本

對於名為drds_testPolarDB-X 1.0資料庫,SHOW NODE的結果如下:

mysql> SHOW NODE\G
*************************** 1. row ******************
                 ID: 0
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS
  MASTER_READ_COUNT: 212
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 2. row ******************
                 ID: 1
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0001_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 3. row ******************
                 ID: 2
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0002_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 4. row ******************
                 ID: 3
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0003_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 5. row ******************
                 ID: 4
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0004_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 6. row ******************
                 ID: 5
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0005_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 7. row ******************
                 ID: 6
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
*************************** 8. row ******************
                 ID: 7
               NAME: DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0007_RDS
  MASTER_READ_COUNT: 29
   SLAVE_READ_COUNT: 0
MASTER_READ_PERCENT: 100%
 SLAVE_READ_PERCENT: 0%
8 rows in set (0.02 sec)
            

可以看到每個分庫都有NAME這個屬性,這就是分庫的分區名。每個分區名都唯一對應一個分庫名,比如DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0003_RDS這個分區名對應的分庫名是drds_test_vtla_0003。得到了分區名,就可以使用PolarDB-X 1.0的自訂HINT指定分庫執行SQL語句了。

  • 指SQL在第0個分庫上執行:
    SELECT /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ * FROM table_name;                 
  • 指定SQL在多個分庫上執行:
    SELECT /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS','DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS')*/ * FROM table_name;
                  

    這條SQL語句將在DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDSDRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS這兩個分區上執行。

  • 查看SQL在第0個分庫上物理執行計畫:
    /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ EXPLAIN SELECT * FROM table_name; ```