本文介紹了指定分庫(kù)執(zhí)行SQL的HINT語(yǔ)法和示例。

本文適用于PolarDB-X 1.0 5.3及以上版本,其他版本請(qǐng)參見如何使用HINT(5.2及以下版本適用)

在使用PolarDB-X 1.0的過(guò)程中,如果遇到某個(gè)PolarDB-X 1.0不支持的SQL語(yǔ)句,可以通過(guò)PolarDB-X 1.0提供的NODE HINT,直接將SQL下發(fā)到一個(gè)或多個(gè)分庫(kù)上去執(zhí)行。此外如果需要單獨(dú)查詢某個(gè)分庫(kù)或者已知分庫(kù)的某個(gè)分表中的數(shù)據(jù),也可以使用NODE HINT,直接將SQL語(yǔ)句下發(fā)到分庫(kù)中執(zhí)行。

語(yǔ)法

NODE HINT支持通過(guò)分片名指定SQL在分庫(kù)上執(zhí)行。其中分片名是PolarDB-X 1.0中分庫(kù)的唯一標(biāo)識(shí),可以通過(guò)SHOW NODE語(yǔ)句得到。

通過(guò)分庫(kù)名指定SQL在分庫(kù)上執(zhí)行分兩種使用方式,分別是指定SQL在某個(gè)分庫(kù)上執(zhí)行和指定SQL在多個(gè)分庫(kù)上執(zhí)行。

注意 如果在目標(biāo)表包含Sequence的INSERT語(yǔ)句上使用了指定分庫(kù)的HINT,那么Sequence將不生效。更多相關(guān)信息,請(qǐng)參考使用限制
  • 指定SQL在某個(gè)分庫(kù)上執(zhí)行:

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

    node_name為分片名,通過(guò)這個(gè)PolarDB-X 1.0自定義HINT,就可以將SQL下發(fā)到node_name對(duì)應(yīng)的分庫(kù)中執(zhí)行。

  • 指定SQL在多個(gè)分庫(kù)上執(zhí)行:

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

    在參數(shù)中指定多個(gè)分片名,將SQL下發(fā)到多個(gè)分庫(kù)上執(zhí)行,分片名之間使用逗號(hào)分隔。

    說(shuō)明
    • 使用該自定HINT 時(shí),PolarDB-X 1.0會(huì)將SQL直接下發(fā)到分庫(kù)上執(zhí)行,所以在SQL語(yǔ)句中,表名必須是該分庫(kù)中已經(jīng)存在的表名。
    • NODE HINT支持 DML、DDL、DAL語(yǔ)句。

注意事項(xiàng)

  • 從版本5.4.1開始,PolarDB-X 1.0在拆分表的物理表名中增加了4個(gè)字符的隨機(jī)串,請(qǐng)務(wù)必使用SHOW TOPOLOGY命令獲取邏輯表拓?fù)浜蛯?shí)際的物理表名。
  • 從版本5.4.4 開始,PolarDB-X 1.0提供開關(guān)來(lái)控制拆分表的物理表名中是否包含隨機(jī)串,默認(rèn)為開啟,可以在控制臺(tái)“參數(shù)設(shè)置”的數(shù)據(jù)庫(kù)級(jí)別參數(shù)中,將“是否啟用隨機(jī)物理表名 ENABLE_RANDOM_PHY_TABLE_NAME”改為false來(lái)關(guān)閉,也可以用HINT來(lái)實(shí)現(xiàn)語(yǔ)句級(jí)別的控制:/*+TDDL:cmd_extra(ENABLE_RANDOM_PHY_TABLE_NAME=FALSE)*/
  • PolarDB-X 1.0自定義HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/兩種格式。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客戶端執(zhí)行帶有PolarDB-X 1.0自定義HINT的SQL時(shí),請(qǐng)?jiān)诘卿浢钪屑由?code class="ph codeph" id="codeph-r1o-yzf-9q3">-c 參數(shù)。否則,由于PolarDB-X 1.0自定義HINT是以MySQL 注釋形式使用的,該客戶端會(huì)將注釋語(yǔ)句刪除后再發(fā)送到服務(wù)端執(zhí)行,導(dǎo)致PolarDB-X 1.0自定義HINT失效。具體請(qǐng)查看MySQL 官方客戶端命令

示例

對(duì)于名為drds_testPolarDB-X 1.0數(shù)據(jù)庫(kù),SHOW NODE的結(jié)果如下:

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)
            

可以看到每個(gè)分庫(kù)都有NAME這個(gè)屬性,這就是分庫(kù)的分片名。每個(gè)分片名都唯一對(duì)應(yīng)一個(gè)分庫(kù)名,比如DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0003_RDS這個(gè)分片名對(duì)應(yīng)的分庫(kù)名是drds_test_vtla_0003。得到了分片名,就可以使用PolarDB-X 1.0的自定義HINT指定分庫(kù)執(zhí)行SQL語(yǔ)句了。

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

    這條SQL語(yǔ)句將在DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDSDRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS這兩個(gè)分片上執(zhí)行。

  • 查看SQL在第0個(gè)分庫(kù)上物理執(zhí)行計(jì)劃:
    /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ EXPLAIN SELECT * FROM table_name; ```