Как улучшить производительность SQL-запросов в MySQL

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

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

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

1 ответ

Решение

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

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;
Другие вопросы по тегам