gpt4 book ai didi

php - 优化使用 IN 和 MAX(date) 的 MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 12:09:20 24 4
gpt4 key购买 nike

我有一个查询,它从名为“customers”的表中返回每个 CustomerID 的最新日期时间。表中有许多不同的 CustomerID 条目,并且许多行具有相同的 CustomerID 但具有不同的日期时间条目。我一直在使用下面的查询,该查询为每个唯一的 CustomerID 返回一行以及该 CustomerID 的最新(最大)日期。该表大约有 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 行),但在我的 Web 主机上,它会超时,永远不会完成任务,相同的 PHP 脚本,与位于 Web 主机服务器上的 DB 相同的数据库数据。 Web 主机上的所有其他脚本都运行良好,其中一些脚本也相当复杂。

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

谢谢。

最佳答案

您的查询没有达到您的预期。它返回日期时间值与表中任何其他客户的最后日期时间相匹配的任何客户。因此,查询可以为单个客户返回多行,其中每行都有一个与其他客户匹配的日期时间值。

我还假设您实际上想要每个客户的最新行并且您想要其他列。否则,一个简单的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) 上建立索引。

关于php - 优化使用 IN 和 MAX(date) 的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30957259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com