[英]Optimise a MySQL query that uses IN and MAX(date)
我有一个查询,该查询从名为“ customers”的表中返回每个CustomerID的最新日期时间。 表中有许多不同的CustomerID条目,许多行具有相同的CustomerID但具有不同的datetime条目。 我一直在使用下面的查询,该查询针对每个唯一的客户ID返回一行,并且该客户ID的最新(MAX)日期。 该表大约有6000行。
客户表:
CustLogID (Primary key, INT 11)
CustomerID (INT 11)
DateTime (DATETIME)
查询:
SELECT
CustomerID AS custid,
DateTime AS latestdatetime
FROM customers WHERE DateTime IN (
SELECT MAX( DateTime )
FROM customers GROUP BY CustomerID
)
ORDER BY CustomerID
我遇到的问题是,在具有本地MySQL DB的开发计算机上,它在一秒钟内返回结果(大约1500行),但是在我的Web主机上,它却永远无法完成任务,相同的PHP脚本,相同的数据库DB位于Web主机服务器上的数据。 Web主机上的所有其他脚本运行良好,其中一些脚本也非常复杂。
如果有人知道为什么这个查询会导致这样的瓶颈或可以重构它,我将不胜感激。
谢谢。
您的查询没有达到您的期望。 它返回的datetime
值与表中任何其他客户的上次datetime匹配的所有客户。 因此,查询可以为单个客户返回多行,其中每行的datetime
值与其他客户匹配。
我还将假设您实际上想要每个客户的最新行, 并且您想要其他列。 否则,一个简单的group by
就足够了(基本上是您的子查询)。
一种解决方法是相关子查询:
SELECT c.*
FROM customers c
WHERE c.DateTime = (SELECT MAX(c2.DateTime )
FROM customers c2
WHERE c2.CustomerID = c.CustomerId
)
ORDER BY CustomerID;
为了提高性能,您需要对customers(CustomerId, DateTime)
进行索引。
使用IN
或JOIN
毫无意义,可以使用以下方法简单地解决此问题:
SELECT
CustomerID custid,
MAX(DateTime) latestdatetime
FROM customers
GROUP BY CustomerID
ORDER BY CustomerID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.