2017-02-18 64 views
3

我有一个简单的查询:慢速MySQL的查询(使用IN)

SELECT Description, Temp1, Temp2, SensorData.DateAndTime 
FROM SensorData 
    INNER Join Sensors on Sensors.ChipId=SensorData.RockID 
WHERE SensorData.Id in (Select max(Id) LastRecord 
         From SensorData 
         Group by RockId) 
ORDER BY DhtTemp; 

它需要3秒。如果我删除内部选择查询并将其替换为查询中的结果,则需要花费0.1秒。如果我单独运行内部查询,则需要.1秒。如果我删除加入传感器它运行在0.5秒(这将是好的。)任何建议?我有关于Id列的索引是INT。

回答

1

ChipId in Sensors表用于连接条件和RockId在内部选择查询是group by列名,您是否试过对这些列进行索引?

在加法尝试此查询:

SELECT Description, Temp1, Temp2, myData.DateAndTime 
FROM 
    (SELECT *,max(id) as mymax FROM SensorData 
     Group by RockId 
     Order by id desc 
    ) as myData 
INNER Join Sensors on Sensors.ChipId= myData.RockID 
WHERE SensorData.Id = mydata.mymax 
ORDER BY DhtTemp; 
+0

我喜欢它。我在内部查询中添加了where子句,以减少返回的行数,并且速度非常快。谢谢! – Jay

1

大多数where in (select ...)查询可以(通过优化器经常自动,但不总是)被改写为连接;试试这个:

select Description, Temp1, Temp2, a.DateAndTime 
from SensorData a 
left join SensorData b on b.RockId = a.RockId 
    and b.ID > a.ID 
join Sensors on Sensors.ChipId = a.RockID 
where b.ID is null 
order by DhtTemp 

在英语中,这意味着“只返回没有更高ID` SensorData行

确保在指数有RockId

+0

是的,一个有效的查询,但很难快! – Strawberry