limit 1 查询 loadregion问题

【问题】 测试环境,测试一张表Limit1操作,表中有2171个非index region,trace SQL发现首次执行时看着会将全量region信息进行load


b7f5ded710a03003a1b7c88678608f5

为什么limit 1时会load所有region信息,即使是 region cache里没有该表的region信息是不是 也只Load几个足够limit的region信息就够了?
第二次执行就不会Load了

image
就这一个region。

你可以把limit 去掉看看,这里就会显示很多region

调用链路 (大概):func Selectfunc (c *CopClient) Sendfunc buildCopTasksSplitKeyRangesByLocationsLocateKeyfindRegionByKeyloadRegion 调用点位

  1. 为什么limit 1时会load所有region信息,即使是 region cache里没有该表的region信息是不是 也只Load几个足够limit的region信息就够了?
    a. region cache 信息会基于 函数中 传入的 ranges 操作,在这条 SQL 情况下 tableReader 算子的 ranges 是 table start_key + end_key ,也就造成了后面 load 这么多 key。
    b. 不过,load 是个比较轻的操作,就是发 request 给 PD,也还好。
    c. 其实如果想 少 loadregion,在 where 限制范围,手动改变构建算子时的扫描范围,在 regionCache 中内容过期后,应该也会少扫。

  2. 为什么第二次不 load 了?
    在 findRegionByKey 中,先基于 CachedRegion 搜索,搜索不到才会真实 load。

像这种全表limit x是不是可以进行下优化,表比较大load region 耗时也有1秒多钟。可能实际业务这种场景不多,

晚上我提个 enhancement issue 吧,我只能尝试解释这种现象的原因,但具体要不要优化,怎么优化还要研发们考量。
晚些(版主会前):我把链接贴上来。

1 个赞

enhancement issue addr → https://github.com/pingcap/tidb/issues/39733

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