耗时45秒的简单MySQL查询(获取一条记录及其“最新”子记录)
我有一个查询,它获取一个客户和该客户的最新交易。目前,1000条记录的查询时间超过45秒。这尤其有问题,因为脚本本身可能需要每分钟执行一次 我相信使用子查询可能是答案,但我在构造它以实际提供所需结果时遇到了困难耗时45秒的简单MySQL查询(获取一条记录及其“最新”子记录),sql,mysql,optimization,Sql,Mysql,Optimization,我有一个查询,它获取一个客户和该客户的最新交易。目前,1000条记录的查询时间超过45秒。这尤其有问题,因为脚本本身可能需要每分钟执行一次 我相信使用子查询可能是答案,但我在构造它以实际提供所需结果时遇到了困难 SELECT customer.CustID, customer.leadid, customer.Email, customer.FirstName, customer.LastName, transaction.*, MAX(t
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更改为相关服务器版本)。我认为您可能有更大的问题。事务。*将从客户的某些事务记录中返回随机值,但不一定是从具有最大事务日期的记录中返回的值。这就是你想要的吗?