2011-03-15 48 views
0

我试过寻找一个解决方案,但似乎无法找到一个。MySQL优化一个有很多额定值的表

我有一个帖子评分表,其中列“评级”是0或1,这取决于一个人是否对某个帖子进行了竖起大拇指或竖起大拇指。目前大约有2000个批准的帖子和280万个评级。

我想找到已通过审核批准的前20名评级职位。下面是我想会的工作查询:

SELECT p.* FROM `posts` p 
    LEFT JOIN `ratings` r ON r.pid=p.id 
    WHERE p.approved=1 
GROUP BY p.id 
ORDER BY AVG(r.rating) DESC LIMIT 0,20 

我对r.rating和查询仍然需要3秒左右添加一个索引。关于如何减少这个时间的任何想法?

+0

你有'r.pid'上的索引吗? – Dre 2011-03-15 06:59:23

+0

你有没有关于p.approved的索引? – judda 2011-03-15 13:59:31

回答

1

那么,再创建一个聚合表,其中将包含所有评级的计算值。并通过一些触发器或调度程序重新计算它。

1

做一些缓冲 - 每次用户对帖子评分时,在帖子表中添加一个字段,您将在其中持有多个评级。仅使用评级表来确定用户是否已投票。