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