2016-06-24 12 views
0

私は次のクエリを使用します。これは、ユーザーが情報をどのくらいまで埋めているかをパーセンテージで作成するために使用します。私はそれをビューとして保存しますが、クエリーは1500ユーザーに対して実行するのに約6分かかります。このクエリを高速化するにはどうすればよいですか?大量のクエリの最適化

これは、ユーザーがアクティブでない時間に毎日1回実行されるクエリとして使用されます。私たちは現在、ユーザーベースを急速に拡大しており、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); 

MySQLの教祖の示唆したように

enter image description here

+0

有用な答えを得るには、少なくともスキーマとEXPLAINを投稿する必要があります。 SQLFiddleはさらに優れています。 –

+0

欠落している説明(およびおそらく欠落しているインデックス)は別として、正しい結果を得ていますか?あなたの質問は、私があなたが得たいと思うものをあなたに与えるものではないようです。または、むしろ:私はあなたの小切手がいつでもあなたに88,9%の価値を与えると思います。 – Solarflare

+0

@NevilleK EXPLAINに追加しましたが、これが存在しないことを知りませんでした。 @ Solar Imが期待した結果を得ています。 – Adam

答えて

0

をEXPLAIN、すべての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);