0

QUERY 1

(
SELECT 
    a.image_name, a.member_id, b.username, c.image_alt , c.img_id, 
a.total_views, c.island_id, c.personal, c.date_upload, COUNT(d.img_id) AS numComm  
FROM 
    members_stats_images a, members b, members_images c, members_images_comments d  
WHERE 
    c.island_id='$island_id'  AND 
    c.personal='N' AND 
    c.approved='Y' AND
    c.is_other<>'Y' AND   
    c.member_id=b.member_id AND 
    a.member_id=b.member_id AND 
    a.image_name=c.image_name AND 
    d.img_id=c.img_id 
GROUP BY 
    d.img_id 
)
UNION 
(
SELECT 
    a.image_name, a.member_id, b.username, c.image_alt , c.img_id, 
a.total_views, c.island_id, c.personal, c.date_upload, 0 AS numComm  
FROM 
    members_stats_images a, members b, members_images c 
WHERE 
    c.island_id='$island_id' AND 
    c.personal='N' AND 
    c.approved='Y' AND 
    c.is_other<>'Y' AND 
    c.member_id=b.member_id AND 
    a.member_id=b.member_id AND 
    a.image_name=c.image_name AND 
    c.img_id NOT IN (SELECT img_id FROM members_images_comments GROUP BY img_id) 
)           

ORDER BY 
    numComm DESC, date_upload DESC 
LIMIT 
    $set_limit, $li

QUERY 2

(
SELECT 
    a.image_name, a.member_id, b.username, c.image_alt , c.img_id, 
a.total_views, c.island_id, c.personal, c.date_upload, COUNT(e.img_id) AS numComm  
FROM 
    members_stats_images a, members b, members_images c, members_photo_see_do d,
 members_images_comments e  
WHERE 
    c.island_id='$island_id' AND 
    c.personal='N' AND 
    c.approved='Y' AND 
    c.is_other<>'Y' AND 
    c.member_id=b.member_id AND 
    a.member_id=b.member_id AND 
    a.image_name=c.image_name AND 
    c.img_id=d.img_id AND 
    d.village_id='$village_id' AND 
    e.img_id=c.img_id 
GROUP BY 
    e.img_id 
)
UNION 
(
SELECT 
    a.image_name, a.member_id, b.username, c.image_alt , c.img_id, 
a.total_views, c.island_id, c.personal, c.date_upload, 0 AS numComm  
FROM 
    members_stats_images a, members b, members_images c, members_photo_see_do d 
WHERE 
    c.island_id='$island_id' AND 
    c.personal='N' AND 
    c.approved='Y' AND 
    c.is_other<>'Y' AND 
    c.member_id=b.member_id AND 
    a.member_id=b.member_id AND 
    a.image_name=c.image_name AND 
    c.img_id=d.img_id AND 
    d.village_id='$village_id' AND 
    c.img_id NOT IN (SELECT img_id FROM members_images_comments GROUP BY img_id)
)           

ORDER BY 
    numComm DESC, date_upload DESC 
LIMIT 
    $set_limit, $limit

ご覧のとおり、2つのクエリは非常に似ています。

2番目のクエリは数秒で実行されますが、最初のクエリは2分以上で実行されます。

誰かが最初のクエリを改善するために何かを提案できますか?

注:関連するすべてのテーブルには、すべてのidフィールドにインデックスがあります。

編集 @G-Nuggetからのアドバイスに従って、上記のクエリをJOINを使用して次のように記述しました。

    SELECT  
        c.img_id, c.image_name, c.member_id, c.image_alt, c.island_id, c.personal, c.date_upload, b.username,  c.island_id, c.personal, c.date_upload, 
        a.total_views,  
        COUNT(e.img_id) AS numComm 
    FROM members_images AS c 
    LEFT JOIN members_stats_images AS a ON c.image_name=a.image_name AND c.member_id=a.member_id
    LEFT JOIN members AS b ON c.member_id=b.member_id 
    LEFT JOIN members_photo_see_do AS d ON c.img_id=d.img_id 
    LEFT JOIN members_images_comments AS e ON c.img_id=e.img_id 
    WHERE 
    c.island_id='$island_id' AND 
    c.personal='N' AND 
    c.approved='Y' AND 
    c.is_other<>'Y' AND 
    d.see_id='$see_id' 
    GROUP BY c.img_id   

これで、遅延なく完全に実行されます。

4

1 に答える 1

3

2つのクエリの唯一の違いはテーブルの追加であるため、members_photo_see_doテーブルからへの結合をサポートするためのインデックスが欠落していることは明らかmembers_imagesです。

クエリとテーブル定義に関する詳細情報がなければ、それ以上のことを言うことはできません。

また、最新のJOIN構文を使用することで、クエリの読み取りと思考の両方が大幅に容易になることがわかります。また、あなたがそれを採用した場合、あなたはここであなたを助けることをより受け入れやすいメンバーを見つけるでしょう。折り返し電話する際は、それを使ってクエリを書いてください。

于 2013-03-20T12:33:03.553 に答える