2017-02-18 13 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 секунды. Если я запускаю только внутренний запрос, это занимает 0,1 секунды. Если я удалю присоединение к датчикам, он запустится через 0,5 секунды (что будет хорошо.) Любые советы? У меня есть индексы в столбцах Id, которые являются INT.

ответ

1

ChipId в 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 

В английском языке это означает «возвращать только SensorData строки, которые не имеют более высокий ID`

Убедитесь, что в индексе на RockId

+0

Да, действительный запрос, но вряд ли быстрый! – Strawberry