[英]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.