我们使用两台具有相同设置和主主复制的 MySQL 服务器。它们位于负载均衡器后面,获得几乎相同的流量、语句等。
在 server1 上,还有一些额外运行的 cron 作业,这是唯一的区别。
但是,我们发现在某些情况下,查询优化器对于两台服务器上的相同查询的行为有所不同。
在这些情况下,我们必须使用 FORCE_INDEX 才能在两台服务器上获得最佳结果。
主要问题是:
- 是否有任何元数据存储在查询优化器使用的服务器上的某个位置?
- 如果我们必须备份和恢复数据库(使用 XtraBackup),查询优化器的行为方式是否相同还是从头开始构建?
感谢您的回复
约阿希姆
最佳答案
优化器的操作部分基于“统计数据”。这些统计信息来自显式的ANALYZE TABLE
或来自对表的某些更改,例如“向表添加超过 10%”。
两位大师之间没有任何东西可以同步统计数据,因此他们可能会疏远。即使在两者上运行 ANALYZE TABLE 也不一定能使它们同步。这是因为在表中添加了“随机探测”来编制统计数据。
FORCE INDEX
是有风险的,因为“今天有用的东西可能会伤害明天”。
可能发生的情况是这样的:您有一个查询处于选择一个查询计划和另一个查询计划之间的边界。优化器的分析表明它们大约是等效的,但是(由于各种原因)它们并非如此。这可能会导致一台服务器做一件事(快速查询计划),而另一台服务器做其他事情(糟糕的查询计划)。
没有“可靠”和“一致”的方法来解决您的问题。
让我们尝试以不同的方式解决这个问题。提供查询、EXPLAIN
和SHOW CREATE TABLE
。 可能有更好的索引和/或重新制定查询来完全避免该问题,并且可能比您当前的查询计划运行得更快。
关于mysql - 了解 MySQL 查询优化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288621/