簡體   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