优化使用IN和MAX的MySQL查询(日期)

时间:2015-06-20 18:05:10

标签: php mysql sql

我有一个查询,它从名为'customers'的表中返回每个CustomerID的最新日期时间。表中有许多不同的CustomerID条目,并且许多行具有相同的CustomerID但具有不同的日期时间条目。我一直在使用下面的查询,每个唯一的CustomerID返回一行,并返回该CustomerID的最新(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数据库,它会在一秒钟内返回结果(大约1500行),但在我的网络主机上它超时却从未完成任务,相同的PHP脚本,数据库位于Web主机服务器上的数据库数据相同。 Web主机上的所有其他脚本运行正常,其中一些也非常复杂。

如果有人知道为什么这个查询导致了这样的瓶颈或者可以重构它,我将非常感激。

感谢。

2 个答案:

答案 0 :(得分:1)

您的查询未按预期执行。它返回的任何客户的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)上的索引。

答案 1 :(得分:0)

使用INJOIN没有意义,可以通过以下方式解决此问题:

SELECT
    CustomerID custid,
    MAX(DateTime) latestdatetime
FROM customers
GROUP BY CustomerID
ORDER BY CustomerID