2016-03-18 58 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秒被緩存? –