簡體   English   中英

非常慢的MYSQL子查詢

[英]Very Slow MYSQL Sub Query

伙計們,我更多的是一個MSSQL人,但我現在正在研究一些MYSQL。

我寫了一個簡單的查詢,帶有子查詢,我無法理解為什么它的生命如此緩慢。

這個查詢:

   SELECT MAX(timestamp), user, status FROM checkin WHERE room_id = 'Room Name' AND timestamp        > DATE_SUB(Now() ,INTERVAL 4005 SECOND) GROUP BY user

運行0.0034秒

然而,這個相對類似的查詢但是嵌套,需要6秒鍾。

SELECT user, status FROM checkin
WHERE timestamp IN
(SELECT MAX(timestamp) FROM checkin WHERE room_id = 'Room Name' AND timestamp > DATE_SUB(Now() ,INTERVAL 4005 SECOND) GROUP BY user)

有人可以幫忙嗎? 我卡住了。

表“checkin”中只有大約900行。 只有room_id列被編入索引。

干杯

編輯謝謝你們...繼承人探索的結果

相關的SUBQUERY checkin ref room_id room_id 202 const 1104使用where; 使用臨時; 使用filesort

考慮使用HAVING子句來實現相同的結果。 MySQL在子查詢優化方面非常糟糕,試試這個:

SELECT MAX(timestamp) as ts, user, status 
FROM checkin
WHERE room_id = 'Room Name' 
AND   timestamp > DATE_SUB(Now() ,INTERVAL 4005 SECOND)
GROUP BY user
HAVING timestamp = ts

還要確保timestamp上有索引

或者:

SELECT user, status 
FROM checkin
WHERE room_id = 'Room Name' 
AND   timestamp > DATE_SUB(Now() ,INTERVAL 4005 SECOND)
AND NOT EXISTS (SELECT * FROM checkin as newer 
                WHERE newer.timestamp>checkin.timestamp
                AND newer.room_id = 'Room Name'
                AND newer.user = checkin.user)
GROUP BY user

我想,你正在處理依賴子查詢。 這意味着,子查詢不會執行一次(正如您和我所期望的那樣),但對於每一行 - 它都是MySQL的已知錯誤。 如果可以,將其拆分為兩個查詢 - 首先找出MAX值,然后進行選擇。

請對兩個查詢運行EXPLAIN。 你的列上沒有適當的索引。

試試看:

EXPLAIN SELECT user, status FROM checkin WHERE timestamp IN (SELECT MAX(timestamp) FROM checkin WHERE room_id = 'Room Name' AND timestamp > DATE_SUB(Now() ,INTERVAL 4005 SECOND) GROUP BY user);

和:

SELECT MAX(timestamp) FROM checkin WHERE room_id = 'Room Name' AND timestamp > DATE_SUB(Now() ,INTERVAL 4005 SECOND) GROUP BY user

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM