请问where列返回记录数占表总数比例多少才会走索引?

请问where列返回记录数占表总数比例多少才会走索引?
比如一张表t总行数1182248
ID=1080列记录数40513

mysql> select 40513/1182248;
±--------------+
| 40513/1182248 |
±--------------+
| 0.0343 |
±--------------+
1 row in set (0.00 sec)

请问这个select * from t whre ID=1080会走索引吗?

2万3行的记录查询走索引,比如ID=87
超过2万3行记录的都走全表扫描。
不知道这个tidb认为这个比例走全表扫描比走索引快是否合理。

一般来说没有绝对的固定比例吧,走不走索引的影响因素很多,上面这个sql大概率是会走的,看看执行计划就知道了

不走索引,选择了几个列值,行数2万3以下的基本上走索引,行数2万3以上的不走索引。
不知道这tidb大概按多少比例计算的。

数据库是否走索引没有固定的比例阈(比如网传的 5%/10%),核心是基于成本优化器(CBO)计算走索引和全表扫描的成本,选择成本更低的执行路径

3.43% 的返回比例属于 “高选择性”,正常情况下必然走索引

应该还和健康度有关把,如果行数100w,变更90w,这个时候走索引也不一定快。

TiDB 无固定比例阈值,靠 CBO 算成本选路径~ 你这 3.43% 高选择性大概率走索引,执行 EXPLAIN 就能确认,表健康度也会影响优化器判断哦~

表的健康度是100,这个比例按理论是应该走索引的,然后并不走索引.

1 个赞

show create table看下有没有索引

如果有tiflash , tidb会智能选择的

要统计更新一把, 才能走索引

要看你索引是什么索引,有一些没有条件指定索引字段,不会行索引

测试过:
2万3行的记录查询走索引,比如ID=87
超过2万3行记录的都走全表扫描。
统计信息都是最新的。

总觉得 tidb 的成本评估有些问题
参考我发的,有比你这个更极端的,仍然走了表扫描,从执行计划的成本评估来看,怎么也看不出走表扫描的理由
tidb 如何减少表扫描? - TiDB 的问答社区