tidb 动态裁切的疑问

请问下各位老师
为什么tidb的分区表在静态裁切模式下,用不了index join,像文档中的例子
https://docs.pingcap.com/zh/tidb/stable/partitioned-table#动态裁剪模式


不知道我的思考对不对?像文档中的例子
mysql> explain select /*+ TIDB_INLJ(t1, t2) / t1. from t1, t2 where t2.code = 0 and t2.id = t1.id;
在没有动态裁切模式下,不能直接获取t2.id的值,无法和t1.id 进行关联,所以走不了index join嘛(无法利用t1.id 这个索引进行index join)

全局索引目前对分区裁减还不支持(二级索引),估计在 6.5.X 会完善,可以关注

你理解的没错的,目前分区裁减适合缩小数据范围,但是缺少二级索引的支持

感谢回复 这跟全局索引有关系嘛

无索引,就只能扫表了

你这个必须把id作为条件吧,where t1.id<30,不然裁剪什么。。。

我很好奇,在MySQL上实现了index join,但是没有实现分区裁剪,这执行计划,有点让我搞不懂了

没啥好奇的,面对的场景不一样,mysql 也有分区,只不过目前不支持这种 “能力”

执行计划是通过采集和统计信息综合估算得出来的,有偏差,或者不一样也正常

我在6.5.0无论动态裁剪还是静态裁剪,执行计划都一样,都是hash join

image


image

收集下统计信息

@@tidb_partition_prune_mode 这个值是dynamic

收集过的,都是最新的统计信息

看图,静态和动态分别设置过了的

我的6.5测试没问题

我的问题,表用错了,用的以前测试建的表,确实动态裁剪会走indexjoin,静态走的是hashjoin