【问题标题】:How to make execution plans as most accurate as possible如何制定尽可能准确的执行计划
【发布时间】:2022-10-14 08:40:36
【问题描述】:

每天晚上我都会转储我的 PROD 环境(mysql 8.0.23)以将其导入我的 TEST 环境中。两个系统上的硬件和 mysql 配置相同

我注意到一些查询(在转储之后执行,当 2 个数据库仍然对齐时)在 2 个系统上以不同的方式表现,具有不同的执行计划,当然还有不同的性能

我的猜测是 TEST 环境的性能更好,因为每个表都是从头开始创建的,因此表和索引的统计信息更准确,而 PROD 在白天加载了大量的插入、更新和删除。

有什么方法可以使 PROD 的行为方式相同?

我尝试在每个表上运行 OPTIMIZE 和 ANALYZE(其中大多数是 InnoDB),但执行计划仍然不同

谢谢

【问题讨论】:

  • 删除表并再次重新导入它们可能会有所帮助。

标签: mysql


【解决方案1】:
  • TEST 上的新负载需要执行更多 I/O,因为“缓存”最初是空的。 (参见 InnoDB 的 buffer_pool。)我希望 TEST 可能高达 10一样慢。再次运行相同的查询以查看它的速度。
  • EXPLAIN 进行估算;它通常是不一致的。别担心。
  • 如果 PROD 很忙,但 TEST 只运行一个查询,则 PROD 可能会更慢。这是由于正在发生的其他事情。
  • InnoDB 基本上不需要OPTIMIZE;不要在上面浪费时间。
  • ANALYZE 有时会说服 EXPLAIN 提供不同的查询计划。这并不能证明太多。
  • 删除并重新导入不太可能解决任何问题。

向我们展示一个显着差异的示例。当给出一个具体的例子时,我们更有可能发现一些东西。提供

  • 查询
  • EXPLAIN SELECT -- 在两台服务器上
  • 查询时间
  • 为查询中涉及的表显示创建表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 2015-03-17
    • 2010-10-24
    相关资源
    最近更新 更多