编辑6.log (1.8 KB)
实际运行了一遍,结果和执行计划预估基本一致(27177550,27098336)
分析了一下,有一种可能:
由于有 limit 50 的限制,第一个条件在 join 的时候很快就满足了这个 limit 50 的限制,所以剩下的计算被丢弃了。第二个条件却很难满足 limit 50 的限制。
证明可以看第二个条件 b.client = ‘vsdshanghaigo’ 的 explain analyze:
IndexJoin_58 这个只返回了 0 条数据,说明整个执行过程没有满足 limit 50 要的 50 行,导致了它扫描完了所有数据。
编辑7.log (6.9 KB)
我去掉了时间排序和limit 发现执行计划还是很异常
vsdshanghaigo 有2567808记录扫描2664201条
contract 有20247014条记录扫描325696条
contract | 20247014
IndexScan_39 | 325729.91 | cop | table:b, index:client, range:[“contract”,“contract”], keep order:false | proc max:686ms, min:158ms, p80:611ms, p95:636ms, rows:20249811, iters:19872, tasks:21 | N/A
vsdshanghaigo | 2567808
IndexScan_39 | 2654096.60 | cop | table:b, index:client, range:[“vcreditshandai”,“vcreditshandai”], keep order:false | proc max:515ms, min:191ms, p80:515ms, p95:515ms, rows:2567953, iters:2526, tasks:4 | N/A
那执行计划的count是什么含义?
执行计划的 count 是统计信息和代价模型的估算值
是预估值吗?为什么在使用contract的时候差距那么大呢?
数据量过大后,估算值会有些偏差,总体来说没有差上很多个数量级的话,planner 都能选中一个合理的执行计划。
理解了,非常感谢。
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。