2017-08-15 179 views
0

我有很多簡單的查詢到在MySQL Workbench中運行:我需要加入許多查詢結果在一個結果

SELECT deviceID 
    , from_unixtime(timestamp) 
    FROM EventData 
where accountID = '001' 
    and deviceID = 'FFF' 
order 
    by timestamp desc 
limit 1; 

我這樣做是爲了得到一個非常巨大的積極的每deviceID的最大timestamp值這就是爲什麼我做很多查詢以獲得更快的結果。

我試過「deviceID IN(...)」,但它需要很長時間,我不想掛斷服務器。

+0

您可以使用'UNION ALL'來獲得所有的結果(或者如果你想要獨特的結果,只需'UNION')。然而,看看凱斯賈德的回答 - 你應該能夠將結果分組。多個查詢通常比單個查詢慢。在這種情況下,如果這兩個聯合查詢的運行速度比Caius的分組查詢快,我會感到非常驚訝。如果你發現查詢很慢,你可以使用MySQL的'explain'功能來找出原因(通常是因爲沒有使用索引)。 – RToyo

+0

我只寫了兩行,但我有大約100多。請閱讀我的回答蔡斯 –

+0

一個'union all'應該爲你做。另外 - 我知道我說的很明顯 - 當你達到不能再執行基本查詢的程度時(假設你正在正確使用你的索引),那麼可能是時候開始研究新的硬件,或者轉向雲數據庫。 – RToyo

回答

1

爲什麼不使用內置函數來彙總數據?

SELECT 
    deviceID, 
    from_unixtime(MAX(timestamp)) as timestamp 
FROM 
    EventData 
where 
    accountID='001' 
GROUP BY 
    deviceID 
+0

該帳戶有1000多個deviceID,我需要大約一百個最大時間戳。該表是一個innoDB,真的很大(超過250GB)和活躍,所以MAX功能不起作用,我已經嘗試並得到錯誤的結果。 –

+0

最大值不工作,因爲在MySQL拒絕運行查詢?或者它只需要很長時間? accountid/deviceid/timestamp三元組索引?我的查詢可以完全從索引中回答。如果證明不是通過最大查詢獲取數據的好方法,則可能希望使用觸發器來維護單個設備ID和時間戳的單獨表;如果插入到大表中的行具有比小表中更高的時間戳,則會觸發更新時間戳列。小表可以用於此查詢 –

+0

MAX給我錯誤的結果。我只用一個身份證,我知道正確的時間戳(15分鐘前),並從大約2個月前給我一個時間戳。是的,三列是主鍵。 –