2016-06-24 24 views
0

我有以下查詢,它用於創建用戶填充其信息的距離的百分比。我將它作爲視圖存儲,但查詢需要大約6分鐘才能運行1500個用戶。我怎樣才能加快這個查詢?大規模查詢的優化

它將用作查詢,每當用戶處於非活動狀態時,該查詢將每天運行一次。我們目前正在迅速擴大我們的用戶羣,我只是擔心它將完全錯誤的15,000用戶。

所以請MySQL大師的,我求求你的幫助!

CREATE VIEW profile_check AS(
SELECT users.id, 
    FORMAT((IF(
     COUNT(users.firstname)+ 
     COUNT(users.lastname)+ 
     COUNT(users.gender)+ 
     COUNT(users.country)+ 
     COUNT(users.address_one)+ 
     COUNT(users.city)+ 
     COUNT(users.zipcode)+ 
     COUNT(users.housenumber)+ 
     COUNT(users.phonenumber)+ 
     COUNT(users.educationlevel_id) = 10, 1, 0) + 
    IF(
     COUNT(assesspassionresults.user_id) > 0, 1, 0) + 
    IF(
     COUNT(assessmentcompetencyresults.user_id) > 0, 1, 0) + 
    IF(
     COUNT(assessmentstrengthresults.user_id) > 0, 1, 0) + 
    IF(
     SUM(CASE WHEN timelines.component_of = "employer" THEN 1 ELSE 0 END) > 0, 1, 0) + 
    IF(
     SUM(CASE WHEN timelines.component_of = "individual" THEN 1 ELSE 0 END) > 0, 1, 0) + 
    IF(
     COUNT(interests.user_id) > 0, 1, 0) + 
    IF(
     COUNT(skills.user_id) > 0, 1, 0) + 
    IF(
     COUNT(users_mediafiles.user_id) > 0, 1, 0))/9 , 0) as profiel_check 
FROM users 
LEFT JOIN assesspassionresults 
    ON users.id = assesspassionresults.user_id 
LEFT JOIN assessmentcompetencyresults 
    ON users.id = assessmentcompetencyresults.user_id 
LEFT JOIN assessmentstrengthresults 
    ON users.id = assessmentstrengthresults.user_id 
LEFT JOIN timelines 
    ON users.id = timelines.user_id 
LEFT JOIN interests 
    ON users.id = interests.user_id 
LEFT JOIN skills 
    ON users.id = skills.user_id 
LEFT JOIN users_mediafiles 
    ON users.id = users_mediafiles.user_id 
GROUP BY users.id); 

的EXPLAIN

enter image description here

+0

要獲得有用的答案,您至少需要發佈架構和EXPLAIN;一個SQLFiddle會更好。 –

+0

除了缺少解釋(可能缺少索引):你確定你正在得到正確的結果嗎?您的查詢看起來像它不會給你我想你想得到的。或者說:我想你的支票在任何時候都會給你88,9%的價值。 – Solarflare

+0

@NevilleK我在EXPLAIN中添加了,不知道這存在。 @ Solar Im獲得預期的結果,如果我只爲一個用戶運行它。 – Adam

回答

0

隨着MySQL的大師的建議,將在索引中的所有列的user_id解決將我的性能問題。它做到了!

ALTER TABLE assesspassionresults ADD INDEX (user_id); 
ALTER TABLE assessmentcompetencyresults ADD INDEX (user_id); 
ALTER TABLE assessmentstrengthresults ADD INDEX (user_id); 
ALTER TABLE timelines ADD INDEX (user_id); 
ALTER TABLE skills ADD INDEX (user_id); 
ALTER TABLE users_mediafiles ADD INDEX (user_id); 
ALTER TABLE interests ADD INDEX (user_id);