全部产品
云市场
云游戏

INDEX HINT

更新时间:2020-08-07 21:05:19

PolarDB-X支持全局二级索引(Global Secondary Index,GSI),您可以通过INDEX HINT指定从GSI中取得查询结果。

使用限制

  • MySQL版本需为5.7或以上,且PolarDB-X版本需为5.4.1或以上。
  • INDEX HINT仅对SELECT语句生效。

语法

  1. # FORCE INDEX
  2. tbl_name [[AS] alias] [index_hint]
  3. index_hint:
  4. FORCE INDEX({index_name})
  5. # INDEX()
  6. /*+TDDL:
  7. INDEX({table_name | table_alias}, {index_name})
  8. */
  9. index_list:
  10. index_name [, index_name] ...
  11. # IGNORE INDEX
  12. INGORE INDEX(index_list)
  13. # USE INDEX
  14. USE INDEX(index_list)

PolarDB-X INDEX HINT支持如下语法:

  • FORCE INDEX():语法与MySQL FORCE INDEX相同,若指定的索引不是GSI,则会将FORCE INDEX下发到MySQL上执行。关于GSI基本原理,请参见PolarDB-X全局二级索引文档
  • INDEX():通过表名、别名和索引名来使用指定的GSI,HINT在如下情况中不生效:
    • 查询中不存在指定的表名/别名。
    • 指定的索引不是指定表上的GSI。
  • IGNORE INDEX(): 语法与MySQL IGNORE INDEX 相同,用于忽略某些索引集合。
  • USE INDEX():语法与MySQL USE INDEX 相同,用于使用某些索引集合。
  • PolarDB-X自定义HINT支持/*+TDDL:hint_command*//!+TDDL:hint_command*/两种格式。
  • 如果使用/*+TDDL:hint_command*/格式,在使用MySQL官方命令行客户端执行带有PolarDB-X自定义HINT的SQL时,请在登录命令中加上-c参数。否则,由于PolarDB-X自定义HINT是以MySQL注释形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致PolarDB-X自定义HINT失效。具体请参见MySQL官方客户端命令

示例

  1. CREATE TABLE t_order (
  2. `id` bigint(11) NOT NULL AUTO_INCREMENT,
  3. `order_id` varchar(20) DEFAULT NULL,
  4. `buyer_id` varchar(20) DEFAULT NULL,
  5. `seller_id` varchar(20) DEFAULT NULL,
  6. `order_snapshot` longtext DEFAULT NULL,
  7. `order_detail` longtext DEFAULT NULL,
  8. PRIMARY KEY (`id`),
  9. GLOBAL INDEX `g_i_seller`(`seller_id`) dbpartition by hash(`seller_id`),
  10. UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING(`seller_id`, `order_snapshot`)
  11. dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3
  12. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);
  • FROM子句中通过FORCE INDEX指定使用g_i_seller

    1. SELECT a.*, b.order_id
    2. FROM t_seller a
    3. JOIN t_order b FORCE INDEX(g_i_seller) ON a.seller_id = b.seller_id
    4. WHERE a.seller_nick="abc";
  • 通过INDEX+表别名指定使用g_i_buyer

    1. /*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123
  • FROM子句中通过IGNORE INDEX忽略索引g_i_seller

    1. SELECT t_order.id,t_order.order_snapshot FROM t_order IGNORE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';
  • FROM子句中通过USE INDEX使用索引g_i_seller

    1. SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';