PolarDB-X 1.0支持全局二級索引(Global Secondary Index,簡稱GSI) ,您可以通過INDEX HINT命令指定從GSI中獲取查詢結(jié)果。
使用限制
- MySQL版本需為5.7或以上,且PolarDB-X 1.0內(nèi)核小版本需為5.4.1或以上。
- INDEX HINT僅對SELECT語句生效。
注意事項
PolarDB-X 1.0自定義HINT支持/*+TDDL:hint_command*/
和/!+TDDL:hint_command*/
兩種格式。若使用/*+TDDL:hint_command*/
格式時,在使用MySQL 官方命令行客戶端執(zhí)行帶有PolarDB-X 1.0自定義HIN的SQL時,請在登錄命令中加上-c參數(shù),否則由于PolarDB-X 1.0自定義HINT是以MySQL注釋形式使用的,該客戶端會將注釋語句刪除后再發(fā)送到服務(wù)端執(zhí)行,導(dǎo)致PolarDB-X 1.0自定義HINT失效,詳情請參見MySQL官方客戶端命令。
語法
PolarDB-X 1.0支持如下兩種語法INDEX HINT:
FORCE INDEX()
:語法與MySQL FORCE INDEX相同,若指定的索引不是GSI,則會將FORCE INDEX下發(fā)到MySQL上執(zhí)行。# FORCE INDEX() tbl_name [[AS] alias] [index_hint] index_hint: FORCE INDEX({index_name})
INDEX()
: 通過表名和索引名組合或表在當(dāng)前查詢塊中的別名和索引名組合來使用指定的GSI。# INDEX() /*+TDDL: INDEX({table_name | table_alias}, {index_name}) */
說明 上述語句在以下情況中不會生效:- 查詢中不存在指定的表名或別名。
- 指定的索引不是指定表上的GSI。
示例
CREATE TABLE t_order (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
GLOBAL INDEX `g_i_seller`(`seller_id`) dbpartition by hash(`seller_id`),
UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING(`seller_id`, `order_snapshot`)
dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);
- 在FROM子句中通過FORCE INDEX指定使用
g_i_seller
SELECT a.*, b.order_id FROM t_seller a JOIN t_order b FORCE INDEX(g_i_seller) ON a.seller_id = b.seller_id WHERE a.seller_nick="abc";
- 通過INDEX加上表的別名指定使用
g_i_buyer
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123