2015-02-07 18 views
0

我写了一个正常工作的查询。但是需要更多时间来执行。我无法理解如何优化当前查询。如何优化我当前的Mysql查询

这里将会有一千或一百万的数据。喜欢不喜欢表每个用户每个喜欢/不喜欢插入一个新行。

我的查询:

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 

sqlfiddle Demo

+0

你可以添加你的'CREATE TABLE'语句吗?以及你有什么索引。最好格式化这个SQL,这样我们就可以看到广泛的结构 - 让读者更容易。 Upvotes for SQL小提琴,人们可以玩。 – halfer 2015-02-07 09:34:01

+0

另外,让我们知道(粗略)每个表有多少行,以及查询运行的时间。如果您可以生成解释计划,那也可以帮助您。 – halfer 2015-02-07 09:35:22

+0

@halfer sqlfiddle演示添加。 – 2015-02-07 10:34:57

回答

0

答案很简单:你尝试做太多的一个查询。据我所知,你想知道所有的用户,这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 

如果您需要了解任何其他时间段的数据,请运行一个单独的查询。

降低数据库负载的另一种方法是将数据库中的总喜欢数与您的用户一起存储。这只是一个简单的计数器,没有什么奇特的,但是它可以保证你不得不一直总结喜欢的东西。

你也可以有周期的计数器,只需在投票结束时更新每个计数器即可。