【问题标题】:Why does the same exact query produce 2 different MySQL explain results?为什么相同的查询会产生 2 个不同的 MySQL 解释结果?
【发布时间】:2013-08-15 14:22:50
【问题描述】:

我有一个简单的SELECT * From tv Where Client = 'ABCD' 查询,当我执行EXPLAIN EXTENDED 时,它给了我两个不同的结果。执行查询时,其中一个需要几毫秒,而另一个大约需要 3 秒。为什么它会给出两种不同的解释结果以及导致缓慢的原因?

慢查询:

快速查询:

【问题讨论】:

  • 您需要与我们分享这两个准确查询
  • @gvee - 它在 POST 中。 SELECT * FROM TableA Where Client = "ABCD"。两者的区别在于,一个是在内部服务器上运行,而慢查询是在一个colo上运行。
  • 好吧,您的图像显示了一个名为“tv”的表格,而不是“TableA”。此外,双引号应该是单引号。因此混乱。什么是“结肠”?
  • 您能否连接到您的两台服务器并向我们展示SHOW CREATE TABLE tv 的结果。请编辑您的问题添加。必须通过 cmets 挖掘来查找各种信息是相当低效的。
  • @spencer7593 SHOW CREATE TABLE tv 将显示大部分信息。没有它,我们只能推测......

标签: mysql explain


【解决方案1】:

我通过更新表统计信息解决了这个问题。

我在 MySQL 上做过:

OPTIMIZE TABLE [tablename]

【讨论】:

  • 你现在为我节省了很多头发。 :D
【解决方案2】:

我可以确认这种行为。只是花了一整天的时间才得到它。有时,当您不使用语句 PRIMARY = PRIMARY(例如,仅使用复合主键的一部分)时,Mysql(或 MariaDB)会在具有大量数据的数据库上执行 MUCH 更快的查询(生产数据库),而不是仅包含样本数据的数据库(生产环境)

我的解决方案是复制部分产品。数据到开发数据库 - 它使用不同的策略执行一些查询,当然更快。

【讨论】:

    【解决方案3】:

    Q为什么同一个查询会产生2个不同的MySQL解释结果?

    A 因为有些不同。如果不在查询中,则在两个表之间,或数据库实例之间。

    所有这些都应该审查,找出不同之处:

    • 它们是否在相同版本的 MySQL 上运行 (SHOW VARIABLES LIKE '%version%')
    • 实例是否运行相同的字符集 (SHOW [GLOBAL] VARIABLES LIKE 'character_set%')
    • 表格列是否使用相同的字符集(SHOW CREATE TABLE
    • 两个表是否使用相同的存储引擎? (SHOW CREATE TABLE)
    • 如果主键是复合键,列的顺序是否相同 (SHOW CREATE TABLE)
    • 统计数据是否最新且准确?
    • 由于大量插入、更新、删除活动,其中一张表是否碎片化?
    • MyISAM 密钥缓存或 InnoDB 缓冲区在两台服务器上的大小是否相同?

    【讨论】:

    • 表中的所有内容都相同,只是索引中的字段顺序不正确。其中两个字段被翻转。
    • 是否有可以运行的命令来查看统计信息是否最新且准确?
    • 您认为索引中的列顺序可能与查询的执行计划有关吗?您认为用不同顺序的列定义的索引会被优化器认为是等效的还是不同的?我有一个想法...为什么不尝试创建一个定义为 SAME 的索引,看看是否有任何影响。
    【解决方案4】:

    那么估计的行数也不同。

    所以 MySQL 使用表统计信息来确定我们需要哪些索引以及如何使用它们。由于表中似乎有不同数量的行,因此查询计划会有所不同是合理的,因为统计信息会有所不同。

    更新:

    我没有正确读取行列。因此,我假设行数存在巨大差异。不是这种情况。似乎使用慢查询的表上的统计信息可能已过时。请在慢查询表上运行 OPTIMIZE TABLE 语句。这实际上将重建表。

    【讨论】:

      【解决方案5】:

      慢查询显示类型为ref,而快速查询显示类型为range。我怀疑您在慢表上的 Client 行上缺少索引。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-15
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多