本文介紹了指定分庫(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í)行。
-
指定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_test
的PolarDB-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_RDS
、DRDS_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; ```