TIDB like 'ABC%' 不走索引

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
在数据库执行计划中发现like ‘ABC%’ % 无法走索引,只能全表检索,请帮忙分析下原因,
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

贴一下表结构,执行计划

发下表结构看下

还有数据量也贴下,数据行数太少也不走索引

统计信息不准确,表的大小和数据分布,索引的选择性,查询的复杂性等因素都有影响,导致不走索引,看一下执行计划来进行分析。

看一下统计信息是否准确,或者是不是select 字段过多,查询索引在回表,不如直接全表快

explain 、 explain analyze 分析下

看下索引是否有效,查看下表的元信息、健康度 show status_meta、show status_healthy,看是否需要更新下统计信息

:thinking:执行explain analyze看看呢

统计信息准确率 100%

hint 绑定下试试强制走某个索引 看看效果

explain analyze SELECT /*+ use_index(‘别名’, ‘索引名称’) */ * FROM t2 as 别名 WHERE a > 1 AND b = 1;
–创建绑定

– Hint 能生效的用法

CREATE GLOBAL BINDING for SELECT * FROM t2 as 别名HERE a > 1 AND b = 1

USING SELECT /*+ use_index(‘别名’, ‘索引名称’) */ * FROM t2 as 别名 WHERE a > 1 AND b = 1;

–查询绑定

SHOW GLOBAL BINDINGS

–删除绑定

DROP GLOBAL BINDING FOR

SELECT * FROM t2 WHERE a > 1 AND b = 1

这个是回表慢,建议用联合索引过滤大部分数据

:flushed:能把语句也贴一下么?看上去是选择了另外一个索引吧,好像一个sql只能用一个索引。

走like会比走start_time过滤更多数据吗,如果不会,那现在走start_time没问题的。
start_time是一个范围值,就算跟like的字段是联合索引,也不能走这个索引啊。

如果走like会更优,那就用hint绑定like字段的那个索引,强行走like

而且从整个sql来看,表l和表d走index join应该更好吧

看着 走索引(range)了。是不是分区表,跨分区,然后回表了。

具体SQL是什么 ,表数据量 ,结果集数据量是多少

最好是能尝试一下tiflash+mpp。

根算子是hashagg的情况下,提升会很明显。

先用HINT强制走试试,能走的话,重新统计一下表信息