Я написал запрос, который работает правильно. Но для выполнения требуется больше времени. Я не могу понять, как я могу оптимизировать свой текущий запрос.
Здесь будет тысячи или миллион данных. Таблица неприязни каждого пользователя за лайк / неприязнь вставлена новая строка.
Мой запрос:
select i.id,i.category,i.url,i.upload_by,i.upload_date,
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id) AS 'allLike',
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '1' DAY) AS 'daytotalLike',
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '7' DAY) AS '7daytotalLike',
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '30' DAY) AS '30daytotalLike',
(select count(*) from `like_dislike` where `ulike`='1' and `imageid`=i.id and i.category !='4' and FROM_UNIXTIME(performdate)>= NOW() - INTERVAL '90' DAY) AS '90daytotalLike',
i.status from `image` as i, `like_dislike` as likeDislike
WHERE i.status='approved' and i.id=likeDislike.imageid and FROM_UNIXTIME(likeDislike.performdate)>= NOW() - INTERVAL '90' DAY
GROUP BY i.id ORDER BY '90daytotalLike' DESC Limit 50
Ответ прост: вы пытаетесь сделать слишком много за один запрос. Насколько я вижу, вы хотите знать для всех пользователей, какие из 50 пользователей имели самые высокие оценки по многим переменным. Да, извините, немного неясно, чего вы здесь добиваетесь.
Итак, избавьтесь от всех подзапросов и оставьте один основной запрос. Что-то вроде:
SELECT
count(*) as 90daytotalLike,
image.id,
image.category,
image.url,
image.upload_by,
image.upload_date,
image.status
FROM
image,
like_dislike
WHERE
like_dislike.ulike = 1 AND
image.category != 4 AND
image.status = 'approved' AND
image.id = like_dislike.imageid AND
FROM_UNIXTIME(like_dislike.performdate) >= NOW() - INTERVAL '90' DAY
GROUP BY image.id
ORDER BY '90daytotalLike' DESC Limit 50
И если вам нужно знать данные за любой другой период, запустите отдельный запрос.
Другой способ снизить нагрузку на вашу базу данных — сохранить общее количество лайков в базе данных у вашего пользователя. Это просто простой счетчик, ничего особенного, но он избавит вас от необходимости постоянно собирать лайки.
У вас также могут быть счетчики для периодов, просто обновляйте каждый счетчик по истечении срока голосования.
Других решений пока нет …