1

ここに画像の説明を入力こんにちは、以下のすべてのクエリは非常に遅く、最適化できないようです。

私は2つの方法を試しました。どちらも非常に遅いです。

各 image_tag からランダムなアイテムと、タグに属する画像の量を取得する必要があります。アドバイスをいただければ幸いです。どちらの方法でも実行するのに2分かかるクエリ。画像数と結合に関連して遅い。画像カウント自体は非常に高速です。参加時は非常に遅い。

SELECT T.id, T.title, T.guid_id, T.hits, al.title, tt.title, tt.raw, it.tag_title_id
,((ACOS(SIN(53.38946 * PI() / 180) * SIN(geo.latitude * PI() / 180) + COS(53.38946 * PI() / 180) 
* COS(geo.latitude * PI() / 180) * COS((-2.599586 - geo.longitude) * PI() / 180)) * 180 / PI()) * 60 * 1.1515)
AS distance, uf.real_name, uf.user_name, itx.image_count
FROM 
     (SELECT imx.id, imx.guid_id,  imx.user_id, imx.approved, imx.hits, imx.title, imx.visible, imx.geolocation_id, imx.advertise_to
      FROM image imx
      ORDER BY floor(RAND()*(SELECT count(1) FROM image)))
      AS T
INNER JOIN image_tag it ON T.id = it.image_id 
INNER JOIN tag_title tt ON it.tag_title_id =tt.id
INNER JOIN album_image ai ON T.id = ai.image_id
INNER JOIN album al ON ai.album_id = al.id
INNER JOIN user us ON T.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 geolocation geo ON T.geolocation_id = geo.id
LEFT JOIN (SELECT image_id, count(*) as image_count FROM image_tag GROUP BY image_id) itx ON itx.image_id = T.id 
WHERE T.visible = in_image_visible
AND T.approved = in_image_approved
AND (T.advertise_to <= in_date_time_now OR T.advertise_to IS NULL)
GROUP BY tt.id;

これは速いです

SELECT * FROM (SELECT image_id, count(*) as image_count 
    FROM image_tag it
    GROUP BY image_id) T
INNER JOIN image im ON T.image_id = im.id

結合にランダムロジックを追加すると、非常に遅くなります

4

2 に答える 2

0

主な問題は、filesorts20,000 行を超えるクエリに 2 つあることです。

これは、インデックスの恩恵を受けずにソートしていることを意味し、これだけ多くの行があると遅くなります。

ランダムな順序付けをやめることをお勧めします... PHP の結果を処理している言語が何であれ、それを行ってください。これにより、ファイルソートの1つが削除されます。それが合理的なレベルに達した場合、それは素晴らしいことです。

于 2013-05-25T15:08:35.117 に答える