mysql - 了解 MySQL 查询优化器

标签 mysql query-optimization

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

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

但是,我们发现在某些情况下,查询优化器对于两台服务器上的相同查询的行为有所不同。
在这些情况下,我们必须使用 FORCE_INDEX 才能在两台服务器上获得最佳结果。

主要问题是:

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

感谢您的回复
约阿希姆

最佳答案

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

两位大师之间没有任何东西可以同步统计数据,因此他们可能会疏远。即使在两者上运行 ANALYZE TABLE 也不一定能使它们同步。这是因为在表中添加了“随机探测”来编制统计数据。

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

可能发生的情况是这样的:您有一个查询处于选择一个查询计划和另一个查询计划之间的边界。优化器的分析表明它们大约是等效的,但是(由于各种原因)它们并非如此。这可能会导致一台服务器做一件事(快速查询计划),而另一台服务器做其他事情(糟糕的查询计划)。

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

让我们尝试以不同的方式解决这个问题。提供查询、EXPLAINSHOW CREATE TABLE可能有更好的索引和/或重新制定查询来完全避免该问题,并且可能比您当前的查询计划运行得更快。

关于mysql - 了解 MySQL 查询优化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58288621/

相关文章:

python - 扫描 MySQL 表以获取更新 Python

MySQL-无法更新 View ,即使它显示为可更新

php - 过滤 MySQL 查询。 "AND"运算符

mysql - 需要优化的选择查询

用于多个 count(*) 查询的 MySQL 索引

postgresql - Bitmap Heap Scan 和 Index Scan 是怎么决定的?

mysql - 将 Java Web 应用程序与 jboss、mysql 和 activemq 一起打包以进行部署

当连续条件为真时MySQL计算值

SQL 连接一系列值(整数范围、日期范围等)

database - Redshift 中 GROUP BY 后不必要的 DS_BCAST_INNER