执行计划问题

表结构

 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,这样也不会影响整个集群

SQL bindings 绑定的是什么呢

你这样执行下。。。。
EXPLAIN ANALYZE
SELECT * FROM t1 USE INDEX (idx_uid) WHERE uid = 1445798679 AND gid = 346773286 AND STATUS IN (1) AND col13 IN (1);

有这么个重复索引 ,idx_g我肯定给他删掉了

不可见索引这个功能对你这个场景可能有效
https://docs.pingcap.com/zh/tidb/v8.3/sql-statement-create-index#不可见索引

楼主是想加个作用域,是这意思吗