0

現在、クエリから 300,000 行以上を返す Web サイトの高速化に取り組んでいます。これがDBサーバーに過度の負荷をかけるとは思いませんが、このクエリは、ユーザーが持っている「ギャラリー」の数に応じてwhileループで発生しています。

たとえば、ジョーのアカウントには 10 個のギャラリーがあります。これらの各ギャラリーには x 数の画像があり、それらの画像には x 数のコメントがあります。現在実行中のクエリは...

SELECT count(*) as total 
FROM galleryimage a 
INNER JOIN imagecomments b ON a.id=b.imgId 
WHERE a.galleryId='".$row['id']."' 
AND b.note <> ''

...galleryimage テーブル 334,000 行と imagecomments テーブル 76,000 行をすべて調べて、各ギャラリーで結果を返します。1 つのギャラリーでクエリを実行すると、約 578 ミリ秒で結果が返されますが、多くのギャラリー (たとえば 30 ~ 40) では、ページの読み込み時間が 17 秒以上かかる可能性があります。この問題に対処する方法について何か提案はありますか?

DBアーキテクチャを変更できません....

ギャラリー ID のクエリ

SELECT a.id, 
       a.created, 
       a.name, 
       b.clientName, 
       a.isFeatured, 
       a.views, 
       a.clientId 
FROM gallery a 
INNER JOIN client b 
ON a.clientId = b.id 
WHERE a.isTemp = 0 
AND a.clientRef = '{$clientRef}' 
AND a.finish='1'  
AND a.isArchive='0' 
ORDER BY created 
DESC
4

1 に答える 1

2

クエリを統合して、ループの必要性をなくすことができます。

SELECT 
    a.id, 
    a.created, 
    a.name, 
    b.clientName, 
    a.isFeatured, 
    a.views, 
    a.clientId,
    COALESCE(c.img_cnt, 0) AS gallery_image_count,
    COALESCE(c.comment_cnt, 0) AS gallery_comment_count
FROM 
    gallery a 
INNER JOIN 
    client b ON a.clientId = b.id 
LEFT JOIN
(
    SELECT aa.galleryId, 
           COUNT(DISTINCT aa.id) AS img_cnt, 
           COUNT(1) AS comment_cnt
    FROM galleryimage aa
    INNER JOIN imagecomments bb ON aa.id = bb.imgId
    WHERE bb.note <> ''
    GROUP BY aa.galleryId
) c ON a.id = c.galleryId
WHERE 
    a.isTemp = 0 AND
    a.clientRef = '{$clientRef}' AND
    a.finish = 1 AND
    a.isArchive = 0 
ORDER BY 
    a.created DESC
于 2012-07-22T22:01:41.330 に答える