关于分区表的主键问题

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
测试案例:分区表有两个,list分区,分区键draw_id,区别是主键不同,ticket2主键是(draw_id,ticlet_no),ticket1主键是(ticlet_no,draw_id),数据量2700万,数据完全一样,建表语句如下:


同样的sql执行计划不同


问题是:
分区表要求分区键需要在主键里面,这样主键是联合主键,分区键必须放主键索引第一位吗?我这里测试分区键放第二位sql就走全表扫描了


从测试来看,按draw_id分区,只要draw_id不在主键的第一位,执行计划就会走全表扫描

1 个赞

就是索引最左匹配原则啊(啊?什么?你说关联键draw_id是list分区表的分区键,不能NL_JOIN然后分区裁剪走分区全扫嘛?可能就没实现吧 :joy_cat:

1 个赞

理论上有分区键在where条件里面应该直接查这些分区而不是全表扫描,所以这里让人很疑惑

你说的二楼的简单查询啊,那两个都走了分区裁剪了啊,你看下access object里都有partition关键字,其实是TiDB就没分区全扫的算子,分区全扫显示也是全表扫

两个sql执行时间有差异吗?

主键索引第一位还是第二位,要看过滤条件是用什么过滤

两个sql的actrows是一样的,上面的sql索引最左原则走的是indexjoin 下面sql没有合适索引走的hashjoin,你对下面sql的表单独建一个索引两个就一样了

TiDB的培训视频讲解得很基础。不错。对于分区表的使用我也不多。但视频 里有,视频也考虑不到所有的场景。

2楼的sql查询查询结果速度一样的 ,我认为是执行计划估算的行数不对

看来是执行计划展示的有问题,实际走的没问题