INDEX HINT
版本限制:MySQL 版本 >= 5.7, 并且 DRDS 版本 >= 5.4.1
- DRDS 支持全局二级索引 (Global Secondary Index, GSI) ,通过 INDEX HINT 可以指定从 GSI 中取得查询结果
- INDEX HINT 仅对 SELECT 语句生效
全局二级索引基本原理请参考 DRDS 全局二级索引文档
语法
# FORCE INDEX
tbl_name [[AS] alias] [index_hint]
index_hint:
FORCE INDEX({index_name})
# INDEX()
/*+TDDL:
INDEX({table_name | table_alias}, {index_name})
*/
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 官方客户端命令。
示例
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`);
1. 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";
2. 通过 INDEX + 表别名 指定使用 g_i_buyer
/*+TDDL:index(a, g_i_buyer)*/ SELECT * FROM t_order a WHERE a.buyer_id = 123
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论