2013-05-18 133 views
0

enter image description here如果有人可以幫我解決這個問題,你會很棒。優化mysql映像計數和隨機

基本上一張圖片屬於一張專輯。

我正在運行的查詢非常慢,我可以做一些優化建議。

查詢的緩慢部分是(從album_image其中album_image.album_id = al.id的SELECT count(*))作爲image_count,所以任何關於優化的建議都會很好。我已經使用Explain擴展到在這裏找到問題。我需要選擇一個隨機的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; 
+0

您正在使用InnoDB,我猜想。如果是的話,InnoDB count()的速度非常慢,因爲它會掃描所有的表。您可以嘗試使用MyISAM作爲該表,或者簡單地計算一次,存儲它,然後在不重新計算count()的情況下使用它。看看這裏http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/ – gpicchiarelli

回答

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;