了解MySQL查询优化器

时间:2019-10-08 14:38:16

标签: mysql query-optimization

我们使用两台具有相同设置和master-master复制的MySQL服务器。它们位于负载均衡器后面,并获得几乎相同的流量,语句等。

在server1上,还有一些cron作业正在运行,这是唯一的区别。

但是,我们已经看到,查询优化器在某些情况下在两台服务器上的相同查询的行为不同。
在这种情况下,我们必须使用FORCE_INDEX才能在两台服务器上获得最佳结果。

主要问题是:

  • 查询优化器使用的服务器上是否存储有任何元数据?
  • 如果我们必须使用XtraBackup备份和还原数据库,查询优化器的行为是否会相同或是从头开始构建的?

感谢您的回复
约阿希姆

1 个答案:

答案 0 :(得分:0)

优化器的操作部分基于“统计”。这些统计信息来自显式ANALYZE TABLE或对表的某些更改,例如“向表中添加10%以上”。

两个主机之间没有任何同步数据,因此它们可以分开。即使在两者上同时运行ANALYZE TABLE也不一定会使它们同步。这是因为在表格中编入了“随机探针”以编制统计信息。

FORCE INDEX有风险,因为“今天的帮助可能会伤害明天”。

可能是这种情况:您有一个查询处于选择一个查询计划和另一个查询计划之间的边界。优化程序的分析表明它们大约相等,但是(由于各种原因)它们不是相等的。这可能导致一台服务器执行某项操作(快速查询计划),而另一台服务器执行其他操作(不良查询计划)。

没有解决问题的“可靠”和“一致”方法。

让我们尝试以其他方式解决它。提供查询EXPLAINSHOW CREATE TABLE。可能有一个 更好的索引和/或重新编写的查询可以完全避免问题,并且运行速度可能比您当前的任何查询计划都要快。