我有 3 个innodb
表,比如 A、B 和 C。有一个查询可以连接这三个表以生成结果。
SELECT A.a, B.b, C.c
from A
join B on A.id = B.a_id
join C on C.id = B.c_id
where A.a = 'example' and B.b < 10;
一开始,当我使用“解释”命令测试查询时,它给了我以下顺序:
B -- C -- A
然而,这不是最优的。所以我对所有表运行“分析表”,它给了我:
A -- B -- C
,我相信这是正确的顺序。
然后我将SQL部署到生产中,1个月后,无缘无故的执行计划切换回了不好的选项,即B--C--A。之后,我ANALYZE TABLE
又尝试了几次运行,但这一次,结果让我感到困惑。有时它也给我 B--C--A,有时它给我 A--B--C,有时甚至是其他执行计划。
所以我的问题是:
- 为什么部署后执行计划会发生变化?
- 除了固定执行计划(数据更新和变化很快,所以未来可能会改变最优计划),有没有办法保证最优计划总是得到保证?