2016-07-18 4 views
1

내가 가진 내가 더 많은, 하위 쿼리 실행이 길고 긴 오프셋이 증가 할 다음 MySQL의 쿼리MySQL의 하위 쿼리 긴 작업

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
(SELECT dom FROM dom_small WHERE was_blocked=1) 
ORDER BY count DESC LIMIT 30 OFFSET 4702020 

.

OFFSET 0 MySQL의 쿼리 부하 0 초하지만 4,702,020 MySQL의 쿼리 부하 1 분 19, 49 초이 문제를 해결하는 방법

?

+2

에 쿼리를 최적화 할 수 있도록 인덱스를 가질 것이라고 말했다

은 일반적으로 높은 오프셋 성능이 저하. – 1000111

+1

생각해 보면 모든 것을 선택하고 모두 정렬 한 다음 앞으로 '4702020' 행을 찾고 거기에서 30 행을 전달해야합니다. 물론 그것은 오프셋을 늘리면 더 오래 실행됩니다. – RiggsFolly

+0

중복 http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down –

답변

0

당신은 쿼리 다음과 같은 하위 쿼리

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND was_blocked=1 
ORDER BY count DESC LIMIT 30 OFFSET 4702020; 
+2

@Dmitriy Kupriyanov was_blocked = 1에없는 결과를 원합니다. 그래서 당신의 대답은 틀린 것입니다. – Abhay

+0

오른쪽으로 생각하십시오. 그러나이 경우 오프셋 0 또는 4702020 일 때 모든 쿼리에 대해 동일한 시간을 얻습니다. 약 7 초. 내가 서브 쿼리를 사용하는 이유입니다. –

+0

잘못된 결과가있는 동등한 시간은 여전히 ​​실패합니다. dom "A"에 25 개의 항목이 있고 그 중 1 개가 blocked로 표시된 경우 사용자는 실제로 차단되지 않은 24 개에 관계없이 dom "A"를 전혀 보지 않으려 고합니다. – DRapp

0

사용을 사용하여와 같은 결과를 얻을 수 있습니다

SELECT DISTINCT * FROM dom_small WHERE count>=0 AND dom NOT IN 
    (select * from(SELECT dom FROM dom_small WHERE was_blocked=1) t1) 
    ORDER BY count DESC LIMIT 30 OFFSET 4702020 

이 서브 쿼리의 결과를 캐싱하여 성능을 속도를 높일 수 있습니다. 이전에이 방법을 사용했기 때문에 많은 도움이되었습니다.

그러나 큰 숫자로 오프셋을 사용하여 언급 한 다른 것들이 성능을 저하시킵니다.

+0

생각해 주셔서 감사합니다.하지만 30 행 (2 분 5,96 초) –

+0

@ DmitriyKupriyanov 따라서 하위 쿼리를 최적화하면 성능을 향상시킬 수 없다고 생각합니다. –

0

카운트> = 0이 하지 dom으로 dom_small FROM DISTINCT *을 선택 (dom_small FROM DOM을 선택 WHERE was_blocked = 1) 카운트 DESC의 LIMIT BY ORDER 30 오프셋 4,702,020

다른 코멘트 정확하지만 내가 제공 할 수있는 유일한 제안은 별개의 하위 쿼리가 같은 테이블 "dom_small"에 있다는 것입니다. 또한 count라는 테이블의 실제 열인 것으로 보이는 집계 계수 (*)를 수행하지 않습니다. 나는

(dom, was_blocked, count)