索引命中条件

【TiDB 使用环境】生产环境
【TiDB 版本】v6.5.3
【部署方式】物理机


这是我的索引列的数据分布。
当我查询 type = 6 或 type=10 或 type=3 时,并不会走索引。
我知道索引必须能过滤掉大多数行时才生效。
现在想问一下这个比例是多少?能过滤掉百分之多少的数据时索引才生效?

这个比例不是固定的,和你的索引字段的长度,以及是否需要回表都有关系

有文档链接吗?没找到官方文档关于这块的说明。

不行的话,试试 hint 的方式

https://docs.pingcap.com/zh/tidb/stable/sql-statement-create-binding/#create-globalsession-binding

https://docs.pingcap.com/zh/tidbcloud/choose-index/#index-selection-rules
这里

这个的阈值是多少?

得看源代码,不同版本也不同

没必要纠结这个,hint 对比下走索引和不走索引的执行计划。大概率不走索引耗时更低,这就是最优执行计划

一般不超过30%,查索引,依据索引定位数据,需要多出几步,超过30%就没有优势了

mysql里面 除了6,10其他都可以走到索引

不走索引的话,耗时会更低

楼主可能是想做类似这个文章里面的事情,可以看下这个文章。
MySQL自治平台建设的内核原理及实践(下) - 美团技术团队

可以试下这样

索引是否生效并非由固定的 “过滤百分比” 决定,而是基于成本估算(数据库会比较 “走索引” 和 “全表扫描” 的开销,选择更优的执行计划)

在相关字段上创建索引

产生回表读的话,情况又不一样了

基于CBO的成本算法,统计信息不准确,会导致估算不准确

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。