0

在此处输入图像描述如果有人可以帮助我,你好会很棒。

基本上,图像属于相册。

我正在运行的查询非常慢,我可以提供一些优化建议。

查询的缓慢部分是 (SELECT count(*) from album_image where album_image.album_id = al.id) as image_count 所以任何关于优化的建议都会很棒。我已经使用解释扩展来在这里找到问题。我需要选择一个随机的 guid id,它是每个专辑中的随机图像,因此是内部连接。我读到使用 RAND() 不是很好,但我不确定这是否是从每张专辑中选择随机图像的最佳方式

SELECT al.id, al.alias_title, al.title, al.hits, al.created_on, uf.real_name, uf.user_name, T.guid_id,
(SELECT count(*) from album_image where album_image.album_id = al.id) as image_count
FROM album al 
INNER JOIN (SELECT imx.id, aix.album_id, imx.guid_id FROM image imx 
                INNER JOIN album_image aix ON imx.id = aix.image_id 
                ORDER BY floor(RAND()*(SELECT count(1) FROM image))) AS T ON al.id = T.album_id             
INNER JOIN user us ON al.user_id = us.id
LEFT JOIN user_flickr uf ON us.flickr_id = uf.id
LEFT JOIN user_site uss ON us.user_site_id= uss.id
WHERE al.approved = 'Yes' AND al.visible ='1'
GROUP BY T.album_id;
4

1 回答 1

0

查询的那部分很慢,因为它对返回的每一行执行一次。您需要将逻辑移动到from子句中:

SELECT al.id, al.alias_title, al.title, al.hits, al.created_on, uf.real_name, 
       uf.user_name, T.guid_id,
       ai.cnt as image_count
FROM album al inner join
     (SELECT imx.id, aix.album_id, imx.guid_id
      FROM image imx inner join
           album_image aix
      ON imx.id = aix.image_id 
      ORDER BY floor(RAND()*(SELECT count(1) FROM image))
     ) AS 
     ON al.id = T.album_id INNER JOIN
     user us
     ON al.user_id = us.id left join
     user_flickr uf
     ON us.flickr_id = uf.id left join
     user_site uss
     ON us.user_site_id= uss.id left join
     (select album_id, count(*) as cnt
      from album_image ai
      group by album_id
     ) ai
     on ai.album_id = al.id
WHERE al.approved = 'Yes' AND al.visible ='1'
GROUP BY T.album_id;
于 2013-05-18T15:44:09.187 回答