2016-03-18 33 views
0

不久前,我在这里问了一个问题,以找出在网站的每个部分中通过评论数量排列用户的最佳方式。如果您想知道案件是什么,请点击hereJOIN结构的问题

对我来说,最合适的查询是这一个,它概括了所有的意见在每一个部分,从而使全球排名:

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 

虽然这适合我很好的网站发展的beggining,现在,将超过10万行添加到数据库中,处理如此大量的数据几乎是不切实际的,而不会影响整个网站的加载时间。此外,该查询特别site_articles_comments抛出我关于指标的错误:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 126 Incorrect key file for table '/tmp/#sql_3a0e6_0.MYI'; try to repair it'

修复表并没有做什么,我相信指标都没有问题,因为我有他们所有的设置:

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

我该怎么做才能改善查询并避免这种错误和整体网站滞后?

在此先感谢,

干杯!

回答

0

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

+0

但查询仍然发送致命错误消息... –

+0

您是否克服了这个问题? – michaJlS

+0

我可以让索引正常工作,但仍然缺乏性能。我怎样才能让查询每隔10秒被缓存? –