表结构
CREATE TABLE `t1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`col1` bigint(20) NOT NULL DEFAULT '0' COMMENT '',
`gid` int(10) unsigned NOT NULL COMMENT '',
`uid` bigint(20) NOT NULL COMMENT '',
`kw` varchar(128) NOT NULL COMMENT '',
`col5` tinyint(4) DEFAULT '0' COMMENT '',
`col6` float NOT NULL,
`col7` datetime NOT NULL,
`col8` datetime NOT NULL,
`col9` varchar(1024) DEFAULT NULL COMMENT '',
`col10` varchar(255) DEFAULT NULL COMMENT '',
`col11` tinyint(4) NOT NULL DEFAULT '0' COMMENT ' ',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '',
`col13` tinyint(4) NOT NULL DEFAULT '1' COMMENT '',
`col14` tinyint(4) NOT NULL DEFAULT '-2' COMMENT '',
`col15` tinyint(4) NOT NULL DEFAULT '1' COMMENT '',
PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
KEY `idx_g` (`gid`),
KEY `idx_uid` (`uid`,`kw`),
KEY `idx_gu` (`gid`,`uid`),
KEY `idx_gks` (`gid`,`kw`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1 COMMENT='test'
这个表做了 SQL bindings,但即使使用了 use index 和 force index 他还是走 idx_g 的索引,比较费解
SELECT * FROM db1
.t1
use index (idx_uid) WHERE uid
= 1445798679 AND gid
= 346773286 AND status
IN (1) AND xxx
IN (1)
解决:sql binding 的优先级最高(官网已有介绍)
建议:我们有个场景是索引替换,如上表索引结构 idx_g 和 idx_gks 为重复索引,我们想逐步替换为 idx_gks ,在 SQL 替换过程中使用了 force index 来测试性能,固发现了此问题,建议绑定执行计划是否可以设置一下优先级可供用户选择,来使用 hint 的常规方式进行调试 (7.5.2 也存在该问题 , 8.x 没测)。
个人拍脑袋的想法:是否可以再 session 级别打开一个开关,那么该 session 下的所有 sql 就优先走手动的 hint,这样也不会影响整个集群