2012-07-22 91 views
0

我目前正在加速一个网站,即从查询返回300,000多行。虽然我不认为这是数据库服务器上的太多负载,但此查询是在一个while循环中发生的,具体取决于用户拥有的“画廊”数量。减少mySQL查询和时间

例如,乔在他的帐户中有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 <> '' 

...是334000行翻翻所有galleryimage表和imagecomments表76000行,返回上每家画廊的结果。在单个图库上运行的查询会返回约578毫秒的结果,但对于许多图库,例如30-40,您可能正在查看17+秒的页面加载时间。有关如何处理此问题的任何建议?

我不能改变数据库架构....

查询的画廊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 
+0

当时建立查询你有所有的画廊IDS? – ApplePie 2012-07-22 21:33:01

+0

@ AlexandreP.Levasseur - 是的,我做 - 更新的问题 – Bungdaddy 2012-07-22 21:35:44

+0

你说你不能改变体系结构,但是你可以添加表吗? – Tschallacka 2012-07-22 21:40:32

回答

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 
+0

辉煌的解决方案,谢谢你的帮助。 – Bungdaddy 2012-07-22 22:19:45