执行计划2是预处理了,那执行计划1、3是预处理吗?
都是预处理了,1 和 3 不就跟你传 true 一样嘛
都是预处理,那就都是先执行子查询对吧,这个子查询先单独执行那肯定 (USER_ID
,IS_WP_FINISHED
) 是最优的,单独explain analyze也是这样 ,不管这个子查询结果返回是true还是false ,肯定是要执行子查询做扫描吧
是的
但是执行计划1 3选的不是最优执行计划。
为什么不是最优?我觉得还好,只不过有一个没把limit 下推下去
这个执行计划我不太懂咋看,SQL 中就一个表,我们叫 A 吧,我猜测它是对表 A 做全表扫,然后有SUBPLAN FILTER,我理解就是逐行处理,然后子查询里面用到了索引,没觉得比 TiDB 哪里好啊🤔,我们还没有全表扫描呢
对他这个就是 id=4中每一行驱动子查询,咱先不看他这个咋驱动的,就先看他对子查询的处理,是用了我觉得正确的索引
TiDB 子查询也是用了索引的,只是执行计划里不显示而已
经过 @小龙虾爱大龙虾 讲解下理解了这个执行计划: 在tidb中 处理非关联子查询时先进行预处理,变成一个常量,tidb的执行计划展示对于这种子查询预处理时如果返回是false则执行计划中会显示dual ,如果为真的话则不展示子查询相关的内容, 实际执行计划中的索引扫描不是子查询的执行计划,这里展示的是外层查询的计划。 当为true时(如没有其他条件)可能就是个全表扫描 tidb做了优化选择了一个kv最短的索引来执行。
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。