非常慢的MYSQL子查询

时间:2011-05-11 07:47:42

标签: mysql subquery

伙计们,我更多的是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列被编入索引。

干杯

修改 谢谢你们......继承人探索的结果

DEPENDENT SUBQUERY checkin ref room_id room_id 202 const 1104使用where;使用临时;使用filesort

3 个答案:

答案 0 :(得分:4)

使用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

答案 1 :(得分:2)

我认为,你正在处理依赖子查询。这意味着,子查询不会执行一次(正如您和我所期望的那样),但对于每一行 - 它都是MySQL的已知错误。如果可以,将其拆分为两个查询 - 首先找出MAX值,然后进行选择。

答案 2 :(得分:1)

请对两个查询运行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