【问题标题】:Why does this query take all day to run on mysql?为什么这个查询需要一整天才能在 mysql 上运行?
【发布时间】:2014-03-29 01:43:25
【问题描述】:

我有以下查询需要几分钟才能在 mysql 上运行:

SELECT * FROM
  sys_quote_master AS g1
JOIN (SELECT order_id, order_base_id, max(order_date_last_revised) as mostrecent 
  FROM sys_quote_master group by order_base_id) AS g2
ON g2.mostrecent = g1.order_date_last_revised
ORDER BY g1.order_id;

查询运行了几分钟,最终我得到了这个错误:

表'/tmp/#sql_4f0_1.MYI'的密钥文件不正确;尝试修复它

有人可以帮我看看有什么问题吗?

【问题讨论】:

  • 谁知道?请也发布您的架构。
  • 如果您限制检索的日期并检查返回的行以确保它们符合您的预期,这可能会有所帮助。另外,单独测试子查询以确保它按预期工作。

标签: mysql


【解决方案1】:

如果您解释计划,我想您会看到内部 SELECT 必须执行 TABLE SCAN 才能找到最大值(order_date_last_revised)。

我想知道如果您使用 GROUP BY 和 HAVING,子选择是否会更快?

http://www.java2s.com/Code/SQL/Select-Clause/GROUPandHAVINGwithsubquery.htm

请解释计划告诉你我是否正确。

【讨论】:

    【解决方案2】:

    我没有对此进行测试,但尝试将查询更改为

    SELECT *
    FROM sys_quote_master g3
    WHERE (g3.order_id, g3.order_base_id) IN (
        SELECT g2.order_id, g2.order_base_id
        FROM sys_quote_master g2
        group by order_id, order_base_id
        having max(order_date_last_revised) = (
            select g1.order_date_last_revised
            from sys_quote_master g1
            where g2.order_id = g1.order_id
            and g2.order_base_id = g1.order_base_id
        )
    );
    

    这是假设您在 (order_id, order_base_id) 处有一个索引唯一键,同样......也许您需要更改

    having max(order_date_last_revised) = (
    

    having max(order_date_last_revised) IN (
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多