0

このクエリを再最適化する必要がありますが、非常に遅いです。

SELECT al.alias_title, al.title, al.hits, al.created_on, 
       u.first_name, u.surname, 
       uf.real_name, uf.user_name, 
       T.guid_id 
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
LEFT JOIN user u 
          ON al.user_id = al.id
LEFT JOIN user_flickr uf 
          ON u.id = uf.user_id
WHERE al.approved ='Yes' 
      AND al.visible ='1' 
GROUP BY T.album_id 
ORDER BY al.title;

ギャラリーごとに毎回表示するランダムな画像が必要です。image、album、album image という多対多の関係があります。アルバムごとにランダムな画像が必要で、アルバムをタイトル順に並べる必要があります。内部クエリと rand 関数は非常に遅いと思います。一時テーブルを見てきましたが、これが最善の方法かどうかはわかりません。

4

1 に答える 1

1

ランダムに並べ替えるのは良い習慣ではありません。LIMIT 句を使用して、アプリからランダムな値を生成し (または sql 変数にすることもできます)、単一のレコードを要求することをお勧めします。例

SELECT * FROM table LIMIT ?, 1;

また

SELECT * FROM table LIMIT ?, ?+1;

PD: "?" 変数または入力パラメータである可能性があります

于 2013-01-02T21:03:58.323 に答える