本文介紹了指定分庫執(zhí)行SQL的HINT語法和示例。
在使用PolarDB-X的過程中,如果遇到某個PolarDB-X不支持的SQL語句,可以通過PolarDB-X提供的NODE HINT
,直接將SQL下發(fā)到一個或多個分庫上去執(zhí)行。此外如果需要單獨查詢某個分庫或者已知分庫的某個分表中的數(shù)據(jù),也可以使用NODE HINT
,直接將SQL語句下發(fā)到分庫中執(zhí)行。
語法
NODE HINT
支持通過分片名指定SQL在分庫上執(zhí)行。其中分片名是PolarDB-X中分庫的唯一標識,可以通過SHOW NODE
語句得到。
通過分庫名指定SQL在分庫上執(zhí)行分兩種使用方式,分別是指定SQL在某個分庫上執(zhí)行和指定SQL在多個分庫上執(zhí)行。
-
指定SQL在某個分庫上執(zhí)行:
/*+TDDL:node('node_name')*/
node_name
為分片名,通過這個PolarDB-X自定義HINT,就可以將SQL下發(fā)到node_name
對應的分庫中執(zhí)行。 -
指定SQL在多個分庫上執(zhí)行:
/*+TDDL:node('node_name'[,'node_name1','node_name2'])*/
在參數(shù)中指定多個分片名,將SQL下發(fā)到多個分庫上執(zhí)行,分片名之間使用逗號分隔。
說明- 使用該自定HINT 時,PolarDB-X會將SQL直接下發(fā)到分庫上執(zhí)行,所以在SQL語句中,表名必須是該分庫中已經(jīng)存在的表名。
NODE HINT
支持 DML、DDL、DAL語句。
注意事項
- PolarDB-X自定義HINT支持
/*+TDDL:hint_command*/
和/!+TDDL:hint_command*/
兩種格式。 - 如果使用
/*+TDDL:hint_command*/
格式,在使用MySQL官方命令行客戶端執(zhí)行帶有PolarDB-X自定義HINT的SQL時,請在登錄命令中加上-c
參數(shù)。否則,由于PolarDB-X自定義HINT是以MySQL 注釋形式使用的,該客戶端會將注釋語句刪除后再發(fā)送到服務端執(zhí)行,導致PolarDB-X自定義HINT失效。具體請查看MySQL 官方客戶端命令。
示例
對于名為drds_test
的PolarDB-X數(shù)據(jù)庫,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)
可以看到每個分庫都有NAME
這個屬性,這就是分庫的分片名。每個分片名都唯一對應一個分庫名,比如DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0003_RDS
這個分片名對應的分庫名是drds_test_vtla_0003
。得到了分片名,就可以使用PolarDB-X的自定義HINT指定分庫執(zhí)行SQL語句了。
- 指SQL在第0個分庫上執(zhí)行:
SELECT /*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ * FROM table_name;
- 指定SQL在多個分庫上執(zhí)行:
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_RDS
、DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0006_RDS
這兩個分片上執(zhí)行。 - 查看SQL在第0個分庫上物理執(zhí)行計劃:
/*TDDL:node('DRDS_TEST_1473471355140LRPRDRDS_TEST_VTLA_0000_RDS')*/ EXPLAIN SELECT * FROM table_name; ```