耗时45秒的简单MySQL查询(获取一条记录及其“最新”子记录)

耗时45秒的简单MySQL查询(获取一条记录及其“最新”子记录),sql,mysql,optimization,Sql,Mysql,Optimization,我有一个查询,它获取一个客户和该客户的最新交易。目前,1000条记录的查询时间超过45秒。这尤其有问题,因为脚本本身可能需要每分钟执行一次 我相信使用子查询可能是答案,但我在构造它以实际提供所需结果时遇到了困难 SELECT customer.CustID, customer.leadid, customer.Email, customer.FirstName, customer.LastName, transaction.*, MAX(t

我有一个查询,它获取一个客户和该客户的最新交易。目前,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

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

确保您有一个用于
交易.CustID
的索引,还有一个用于
客户.Email
的索引

假设
customer.CustID
是主键,则应该已经为其编制索引

你可以这样做:

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

正如评论中所建议的,您可以使用该命令来了解查询是否正确使用索引。

在mysql上运行查询“在此处解释您的查询”;结果可能会对您有所帮助。尝试在实际服务器上运行解释并发布结果。是的,请显示解释和表结构。我还建议读@clyfe:显然我们同意@Brian Lacy:请参阅以了解输出的解释(将5.1更改为相关服务器版本)。我认为您可能有更大的问题。事务。*将从客户的某些事务记录中返回随机值,但不一定是从具有最大事务日期的记录中返回的值。这就是你想要的吗?