炼气期DBA
(Ti D Ber Ic01xw Vm)
1
请问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认为这个比例走全表扫描比走索引快是否合理。
啦啦啦啦啦
2
一般来说没有绝对的固定比例吧,走不走索引的影响因素很多,上面这个sql大概率是会走的,看看执行计划就知道了
炼气期DBA
(Ti D Ber Ic01xw Vm)
3
不走索引,选择了几个列值,行数2万3以下的基本上走索引,行数2万3以上的不走索引。
不知道这tidb大概按多少比例计算的。
异乡的大人
(Ti D Ber 2 Qs S2z Ws)
4
数据库是否走索引没有固定的比例阈(比如网传的 5%/10%),核心是基于成本优化器(CBO)计算走索引和全表扫描的成本,选择成本更低的执行路径
异乡的大人
(Ti D Ber 2 Qs S2z Ws)
5
3.43% 的返回比例属于 “高选择性”,正常情况下必然走索引
Kongdom
(Kongdom)
6
应该还和健康度有关把,如果行数100w,变更90w,这个时候走索引也不一定快。
TiDB 无固定比例阈值,靠 CBO 算成本选路径~ 你这 3.43% 高选择性大概率走索引,执行 EXPLAIN 就能确认,表健康度也会影响优化器判断哦~
炼气期DBA
(Ti D Ber Ic01xw Vm)
8
表的健康度是100,这个比例按理论是应该走索引的,然后并不走索引.
1 个赞
yaabb163
(Ti D Ber 6t45g Aux)
12
要看你索引是什么索引,有一些没有条件指定索引字段,不会行索引
炼气期DBA
(Ti D Ber Ic01xw Vm)
13
测试过:
2万3行的记录查询走索引,比如ID=87
超过2万3行记录的都走全表扫描。
统计信息都是最新的。
麻辣机师
(Ti D Ber N Ec Hp7n S)
14
总觉得 tidb 的成本评估有些问题
参考我发的,有比你这个更极端的,仍然走了表扫描,从执行计划的成本评估来看,怎么也看不出走表扫描的理由
tidb 如何减少表扫描? - TiDB 的问答社区