ОБНОВЛЕНИЕ 2:
Улучшен запрос, но он все еще медленный.Я понял, что TIMESTAMPDIFF намного медленнее, чем прямое сравнение между UNIX_TIMESTAMP.Таким образом, изменяя код UPDATE 1, мы получаем почти 20% -ное улучшение скорости.
Увеличение также параметра innodb_buffer_pool_size в my.cnf помогло значительно увеличить скорость.
SELECT `date` , `mem_used` , `mem_total` , `mem_5_min_avg` ,
(`mem_5_min_avg` / `mem_total`) AS mem_usage_rate
FROM (
SELECT *, (
SELECT CEILING( AVG( mem_used ) )
FROM `data` AS t2
WHERE UNIX_TIMESTAMP(t2.date) - UNIX_TIMESTAMP(t1.date) <=300
AND t2.date >= t1.date
AND t1.mem_total = t2.mem_total
AND t1.host_id = t2.host_id
) AS mem_5_min_avg
FROM `data` AS t1
) AS t1
ОБНОВЛЕНИЕ 1: я улучшил запрос, предложив в два раза большую скорость, но он все еще очень медленный для моей большой таблицы.
SELECT `date` , `mem_used` , `mem_total` , `mem_5_min_avg` ,
(`mem_5_min_avg` / `mem_total`) AS mem_usage_rate
FROM (
SELECT *, (
SELECT CEILING( AVG( mem_used ) )
FROM `data` AS t2
WHERE TIMESTAMPDIFF(
MINUTE , t1.date, t2.date ) <=5
AND t2.date >= t1.date
AND t1.mem_total = t2.mem_total
) AS mem_5_min_avg
FROM `data` AS t1
) AS t1
ПЕРВОНАЧАЛЬНЫЙ ПОСТ
Я задавал тот же вопрос в ubuntuforums, и TeoBigusGeekus дал этот ответ, что он работает точно так же, как и должен работать, но он очень медленный для большой таблицы с более чем 100000 строками, которые у меня есть.Выполнение занимает 7,5 секунды, если я ограничиваю запрос 30 строками, и более 20 секунд, если я ограничиваю его 100. Я предполагаю, что для 100000 строк это будет длиться вечно.В любом случае для тех, кто заинтересован в решении, вот оно:
SELECT `date` , `mem_used` , `mem_total` , (
SELECT CEILING( AVG( mem_used ) )
FROM mytable AS t2
WHERE TIMESTAMPDIFF(
MINUTE , t1.date, t2.date ) <=5
AND t2.date >= t1.date
AND t1.mem_total = t2.mem_total
) AS mem_5_min_avg, (
SELECT CEILING( AVG( mem_used ) ) / mem_total
FROM mytable AS t3
WHERE TIMESTAMPDIFF(
MINUTE , t1.date, t3.date ) <=5
AND t3.date >= t1.date
AND t1.mem_total = t3.mem_total
) AS mem_rate_usage
FROM mytable AS t1