减少mySQL查询和时间


Reducing mySQL queries and time

我目前正在加速一个网站,即从查询中返回300000多行。虽然我不认为这对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表334000行和imagecomments表76000行,并返回每个gallery的结果。在单个库上运行的查询在大约578ms内返回结果,但对于许多库,比如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

您可以合并查询并消除循环的需要:

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