2017-02-18 6 views
3

Ich habe eine einfache Abfrage:Langsam mysql query (mit 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; 

Es dauert 3 Sekunden. Wenn ich die innere Auswahlabfrage entferne und sie durch die Ergebnisse der Abfrage ersetze, dauert es .1 Sekunden. Wenn ich die innere Abfrage alleine ausführe, dauert es .1 Sekunden. Wenn ich das Join to Sensors entferne, läuft es in 0,5 Sekunden (was in Ordnung wäre.) Irgendwelche Ratschläge? Ich habe Indizes auf die Id-Spalten, die INT sind.

Antwort

1

ChipId in Sensors Tabelle wird in Joinbedingung und RockId in innere Auswahlabfrage wird group by Spaltenname dieser Spalten, haben Sie versucht, zu indizieren verwendet?

in Addition versuchen, diese Abfrage:

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

Ich mag es... Ich habe der inneren Abfrage eine WHERE-Klausel hinzugefügt, um die Anzahl der zurückgegebenen Zeilen zu reduzieren, und es ist blitzschnell.Danke! – Jay

1

meisten where in (select ...) Abfragen neu geschrieben (oft automatisch vom Optimiser, aber nicht immer) werden können, wie verbindet; versuchen Sie dies:

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 

In Englisch bedeutet dies, „Rückkehr nur Sensordata Zeilen, die keine höhere ID` haben

Achten Sie darauf, in Index auf RockId haben

+0

Ja, eine gültige Abfrage, aber kaum schnell! – Strawberry