5.2.3升级7.5.1后执行计划有问题

执行计划2是预处理了,那执行计划1、3是预处理吗?

都是预处理了,1 和 3 不就跟你传 true 一样嘛

都是预处理,那就都是先执行子查询对吧,这个子查询先单独执行那肯定 (USER_ID ,IS_WP_FINISHED ) 是最优的,单独explain analyze也是这样 ,不管这个子查询结果返回是true还是false ,肯定是要执行子查询做扫描吧

是的 :rofl:

但是执行计划1 3选的不是最优执行计划。

为什么不是最优?我觉得还好,只不过有一个没把limit 下推下去

这是友商库的执行计划,他就走对索引了 KEY TI_O_CREDIT_STOP_OPEN_WP_5_USER_ID_IDX (USER_ID,IS_WP_FINISHED) ,先不看他整体计划

这个执行计划我不太懂咋看,SQL 中就一个表,我们叫 A 吧,我猜测它是对表 A 做全表扫,然后有SUBPLAN FILTER,我理解就是逐行处理,然后子查询里面用到了索引,没觉得比 TiDB 哪里好啊🤔,我们还没有全表扫描呢

对他这个就是 id=4中每一行驱动子查询,咱先不看他这个咋驱动的,就先看他对子查询的处理,是用了我觉得正确的索引

TiDB 子查询也是用了索引的,只是执行计划里不显示而已

经过 @小龙虾爱大龙虾 讲解下理解了这个执行计划: 在tidb中 处理非关联子查询时先进行预处理,变成一个常量,tidb的执行计划展示对于这种子查询预处理时如果返回是false则执行计划中会显示dual ,如果为真的话则不展示子查询相关的内容, 实际执行计划中的索引扫描不是子查询的执行计划,这里展示的是外层查询的计划。 当为true时(如没有其他条件)可能就是个全表扫描 tidb做了优化选择了一个kv最短的索引来执行。

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