全部產品
Search
文件中心

PolarDB:INDEX HINT

更新時間:Jul 06, 2024

PolarDB-X支援全域二級索引(Global Secondary Index,簡稱GSI) ,您可以通過INDEX HINT命令指定從GSI中擷取查詢結果。

使用限制

INDEX HINT僅對SELECT語句生效。

注意事項

PolarDB-X自訂HINT支援/*+TDDL:hint_command*//!+TDDL:hint_command*/兩種格式。若使用/*+TDDL:hint_command*/格式時,在使用MySQL 官方命令列用戶端執行帶有PolarDB-X自訂HIN的SQL時,請在登入命令中加上-c參數,否則由於PolarDB-X自訂HINT是以MySQL注釋形式使用的,該用戶端會將備註陳述式刪除後再發送到服務端執行,導致PolarDB-X自訂HINT失效,詳情請參見MySQL官方用戶端命令

文法

PolarDB-X支援如下兩種文法INDEX HINT:

  • FORCE INDEX():文法與MySQL FORCE INDEX相同,若指定的索引不是GSI,則會將FORCE INDEX下發到MySQL上執行。
    # FORCE INDEX()
    tbl_name [[AS] alias] [index_hint]
    index_hint:
        FORCE INDEX({index_name})               
  • INDEX(): 通過表名和索引名組合或表在當前查詢塊中的別名和索引名組合來使用指定的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