繁体   English   中英

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

[英]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)进行索引。

使用INJOIN毫无意义,可以使用以下方法简单地解决此问题:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM