2014-09-16 2 views
0

У меня есть таблица MySQL, в которой хранятся записи журнала резервного копирования с большого количества устройств (в настоящее время около 750). Мне нужно использовать запрос, чтобы получить подробную информацию о последней записи для каждого устройства. В настоящее время я использую вложенный запрос для достижения этого, который изначально работал нормально. Однако в таблице теперь есть тысячи строк, и запрос занимает много времени. Я хотел бы улучшить производительность запроса и хотел бы знать, возможно ли это благодаря использованию объединений вместо вложенного оператора select или с помощью некоторых других улучшений, которые я мог бы сделать.Как улучшить производительность SQL-запросов в MySQL

Текущий запрос:

SELECT id, pcname, pcuser, checkTime as lastCheckTime, 
    TIMESTAMPDIFF(SECOND,checkTime,now()) as lastCheckAge, 
    lastBackup, diff, threshold, backupStatus, 
    TIMESTAMPDIFF(SECOND,lastBackup,now()) as ageNow 

FROM checkresult 

WHERE (checkTime, pcname) IN 
(
    SELECT max(checkTime), pcname 
    FROM checkresult 
    GROUP BY pcname 
) 

ORDER BY id desc; 

id является первичным ключом для таблицы, и является единственным индексированный столбец.

В таблице используется InnoDB

ответ

4

Попробуйте использовать явное объединение вместо:

SELECT id, checkresult.pcname, pcuser, checkTime as lastCheckTime, 
     TIMESTAMPDIFF(SECOND,checkTime,now()) as lastCheckAge, 
     lastBackup, diff, threshold, backupStatus, 
     TIMESTAMPDIFF(SECOND,lastBackup,now()) as ageNow 
FROM checkresult join 
    (SELECT pcname, max(checkTime) as maxct 
     FROM checkresult 
     GROUP BY pcname 
    ) pm 
    on checkresult.pcname = pm.pcname and checkresult.checkTime = pm.maxct 
ORDER BY id desc; 
+0

Благодаря @GordonLinoff - это работало отлично и уменьшило время выполнения десятикратно (возможно, больше). – Jet86