调用链路 (大概):func Select → func (c *CopClient) Send → func buildCopTasks → SplitKeyRangesByLocations → LocateKey → findRegionByKey → loadRegion 调用点位
-
为什么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 中内容过期后,应该也会少扫。 -
为什么第二次不 load 了?
在 findRegionByKey 中,先基于 CachedRegion 搜索,搜索不到才会真实 load。