2013-05-25 4 views
1

enter image description here 안녕하세요. 아래 쿼리는 모두 매우 느리므로 최적화 할 수 없습니다.Mysql 그룹의 임의 항목 및 그룹의 항목 수를 계산하십시오.

두 가지 방법을 시도했습니다. 둘 다 매우 천천히.

각 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 

나는이

+0

삼각 함수를 제거하면 성능이 어떻게됩니까? – Dancrumb

+0

매우 느리게 여전히 삼각법에 성능 영향이 없음 –

+0

이것을 '실행'을 통해 실행하고 결과를 제공 할 수 있습니까? – Dancrumb

답변

0

가장 큰 문제는 20,000 행에 쿼리에 두 filesorts을 가지고있다 매우 느립니다 가입에 임의의 논리를 추가 할 때 .

이렇게하면 많은 행을 가진 색인이 느리게 정렬되는 색인의 이점없이 정렬 할 수 있습니다.

임의의 순서를 지정하는 것이 좋습니다 ... PHP 결과를 처리하는 모든 언어로 처리하십시오. 파일 중 하나가 제거됩니다. 그것이 합리적인 수준으로 물건을 얻는다면, 그러면 좋습니다.

+0

각 그룹에서 다른 항목을 선택하기 위해 무작위 순서를 추가했습니다.이 작업을 수행 할 수있는 다른 방법이 있습니다. –

+0

기본적으로 각 항목마다 다른 항목을 선택하려고합니다. 그룹당 이미지 –

0

당신은 임의의 이미지를 얻기 위해이 방법을 시도 할 수 : 추가 하위 쿼리 문제에 도움이 될 수 없습니다

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 rand() 

.

관련 문제