全部产品
云市场

INDEX HINT

更新时间:2020-01-13 15:07:43

版本限制:MySQL 版本 >= 5.7, 并且 DRDS 版本 >= 5.4.1

  • DRDS 支持全局二级索引 (Global Secondary Index, GSI) ,通过 INDEX HINT 可以指定从 GSI 中取得查询结果
  • INDEX HINT 仅对 SELECT 语句生效

全局二级索引基本原理请参考 DRDS 全局二级索引文档

语法

  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)

DRDS INDEX HINT 支持以下语法:

  • FORCE INDEX() : 语法与 MySQL FORCE INDEX 相同,若指定的索引不是 GSI,则会将 FORCE INDEX 下发到 MySQL 上执行
  • INDEX() : 通过表名/别名和索引名称来使用指定的 GSI,以下情况 HINT 不生效:
    • 查询中不存在指定的表名/别名
    • 指定的索引不是指定表上的 GSI

注意:

  • DRDS 自定义 HINT 支持 /*+TDDL:hint_command*//!+TDDL:hint_command*/ 两种格式。

  • 如果使用 /*+TDDL:hint_command*/ 格式,在使用 MySQL 官方命令行客户端执行带有 DRDS 自定义 HINT 的 SQL 时,请在登录命令中加上 -c 参数。否则,由于 DRDS 自定义 HINT 是以 MySQL 注释 形式使用的,该客户端会将注释语句删除后再发送到服务端执行,导致 DRDS 自定义 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`);

1. 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";

2. 通过 INDEX + 表别名 指定使用 g_i_buyer

  1. /*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123

3. 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';

3. 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';