JOIN结构的问题

时间:2016-03-18 16:50:11

标签: mysql

不久前,我在这里问了一个问题,找出按照我网站每个部分的评论数量对用户进行排名的最佳方法。如果您想知道案例是什么,请点击here

对我来说最合适的问题是这一个,它总结了每个部分的所有评论,从而给出了全球排名:

SELECT u.id, u.username, (COALESCE(COUNT(DISTINCT(a.id)),0) + COALESCE(COUNT(DISTINCT(f.id)),0)) AS rank 
FROM site_users AS u 
LEFT JOIN site_articles_comments AS a ON (a.user_id = u.id)
LEFT JOIN site_forum_comments AS f ON (f.user_id = u.id)
GROUP BY u.id 
ORDER BY rank DESC 
LIMIT :l

虽然这对于网站开发的开始非常适合我,但现在,在数据库中添加了超过10万行,处理如此大量的数据而不影响整个网站的负载几乎是不切实际的时间。此外,特别是使用此查询,site_articles_comments会向我抛出有关索引的错误:

  

致命错误:未捕获的异常' PDOException' with message' SQLSTATE [HY000]:常规错误:126表的错误密钥文件' /tmp/#sql_3a0e6_0.MYI' ;;尝试修复它'

修复表没有做任何事情,我相信索引不是问题,因为我把它们都设置好了:

ALTER TABLE `site_articles_comments`
ADD PRIMARY KEY (`id`),
ADD KEY `user_id` (`user_id`);

我可以做些什么来改善查询并避免此错误和整体网站滞后?

提前致谢,

干杯!

1 个答案:

答案 0 :(得分:0)

你可以缓存查询的结果,如果显示总是最准确的排名对你来说并不重要(听起来就是这样)。然后,您可以每10分钟/ 1小时等生成一次。