理解MySQL查询优化器

理解MySQL查询优化器,mysql,query-optimization,Mysql,Query Optimization,我们使用两个具有相同设置和主复制的MySQL服务器。它们位于负载均衡器后面,获得几乎相同的流量、语句等 在server1上,还有一些cron作业在运行,这是唯一的区别 但是,我们已经看到,在某些情况下,查询优化器在两台服务器上对同一查询的行为有所不同。 在这些情况下,我们必须使用FORCE_索引在两台服务器上都获得最佳结果 主要问题是: 是否有任何元数据存储在查询优化器使用的服务器上的某个位置 如果我们必须备份和恢复一个数据库(使用XtraBackup),查询优化器会以同样的方式运行,还是从头

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

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

但是,我们已经看到,在某些情况下,查询优化器在两台服务器上对同一查询的行为有所不同。
在这些情况下,我们必须使用FORCE_索引在两台服务器上都获得最佳结果

主要问题是:

  • 是否有任何元数据存储在查询优化器使用的服务器上的某个位置
  • 如果我们必须备份和恢复一个数据库(使用XtraBackup),查询优化器会以同样的方式运行,还是从头开始构建
感谢您的回复

Joachim

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

没有任何东西可以同步两位大师之间的统计数据,因此他们可以分开。即使在两者上运行
ANALYZE TABLE
,也不一定会使它们同步。这是因为“随机探针”被放入表中,以编造统计数据

FORCE INDEX
是有风险的,因为“今天有用的东西明天可能会有害”

可能就是这样:您的查询处于选择一个查询计划和另一个查询计划之间的边界。优化器的分析表明,它们大致相当,但(出于各种原因)并非如此。这可能导致一台服务器做一件事(快速查询计划),而另一台服务器做另一件事(糟糕的查询计划)

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


让我们试着用另一种方式来解决它。提供查询、解释和显示创建表。可能有更好的索引和/或查询的重新格式可以完全避免问题,并且可能比当前的查询计划运行得更快。

官方指南:和官方指南:MySQL的哪个版本?(该“非官方”指南是由对MySQL非常了解的人编写的。)下面是另一个更有限的,指南: