Как улучшить производительность 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;