【问题标题】:Simple MySQL Query taking 45 seconds (Gets a record and its "latest" child record)简单的 MySQL 查询需要 45 秒(获取记录及其“最新”子记录)
【发布时间】:2010-03-13 08:12:35
【问题描述】:

我有一个查询,它获取了一位客户和该客户的最新交易。目前,对于 1000 条记录,此查询需要 45 秒以上。这尤其成问题,因为脚本本身可能需要每分钟执行一次!

我相信使用子查询可能是答案,但我在构建它以实际给我需要的结果时遇到了麻烦。

SELECT
    customer.CustID,
    customer.leadid,
    customer.Email,
    customer.FirstName,
    customer.LastName,
    transaction.*,
    MAX(transaction.TransDate) AS LastTransDate
FROM customer
INNER JOIN transaction ON transaction.CustID = customer.CustID 
WHERE customer.Email = '".$email."'
GROUP BY customer.CustID
ORDER BY LastTransDate
LIMIT 1000

我真的需要尽快解决这个问题。任何帮助将不胜感激!

【问题讨论】:

  • 在 mysql 上运行查询“EXPLAIN your_query_here;”结果可能会对您有所帮助。
  • 尝试在实际服务器上运行 EXPLAIN 并发布结果。
  • 是的,请显示 EXPLAIN 和表结构。我还建议阅读stackoverflow.com/questions/1204402/…
  • @clyfe:显然我们同意。 @Brian Lacy:请参阅 dev.mysql.com/doc/refman/5.1/en/using-explain.html 了解输出说明(将 5.1 更改为相关服务器版本)。
  • 我想你可能有更大的问题。 transaction.* 将从客户的某些交易记录中返回随机值,但不一定从具有最大交易日期的记录中返回随机值。这就是你想要的吗?

标签: sql mysql optimization


【解决方案1】:

确保您有一个transaction.CustID 的索引,以及另一个customer.Email 的索引。

假设customer.CustID 是一个主键,这应该已经被索引了。

您可以create an index如下:

CREATE INDEX ix_transaction_CustID ON transaction(CustID);
CREATE INDEX ix_customer_Email ON customer(Email);

按照 cmets 中的建议,您可以使用 EXPLAIN 命令了解查询是否正确使用索引。

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2012-03-08
    • 1970-01-01
    • 2012-01-12
    • 2016-04-16
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多