[英]How to optimize my current Mysql query
我写了一个查询,可以正常工作。 但是执行需要花费更多时间。 我不明白如何优化当前查询。
这里将有成千上万的数据。 像不喜欢表一样,每个用户喜欢/不喜欢插入新行。
我的查询:
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
如果您需要了解其他任何时期的数据,请运行单独的查询。
降低数据库负载的另一种方法是与用户一起在数据库中存储喜欢的总数。 它只是一个简单的计数器,没什么花哨的,但是它将使您不必时刻累加喜欢就可以保证。
您也可以有一段时间的计数器,只需在投票到期时更新每个计数器即可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.