2012-01-26 1 views
0

워밍업. A는 수백만 개의 레코드를 보유하고, B는 C, D는 ...이> 4초한계와 오프셋이있는 조인의 mysql 성능

으로 리턴하면서

SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 0; 

이것이 < 0.1 초

SELECT ... FROM A LEFT OUTER JOIN B ... LIMIT 1000 OFFSET 1000000; 

에 반환 작게 (단위)이다 정렬이 A의 PK에 의한 것으로 가정하고 모든 조인이 올바르게 인덱싱되면 2 가지 연산이 비슷한 성능을 가져야한다고 가정했을 것입니다. 그러나 오프셋에 따라 O (N)처럼 보입니다 ...

쿼리 계획이 처음부터 1000 개를 선택하고 조인을해야합니까? 나는 두 개의 서로 다른 오프셋과 A의 선택을 비교했다. 그리고 시간 차이는 1 초보다 훨씬 적기 때문에 조인이 주어진 시간의 큰 차이를 설명해서는 안된다.

이것은 mysql 쿼리 계획 최적화 프로그램의 결함입니까?

+0

['이 질문'] (http://stackoverflow.com/questions/1243952/how-can-i-speed-up-a-mysql-query-with-a-large-offset-in-the- 제한 조항)은 다소 비슷한 것처럼 보입니다. 아마도 그것은 당신에게 유용한 정보를 가지고있을 것입니다. –

답변

1

ORDER BY 절을 언급하지 않았으므로 첫 번째 쿼리의 한도에 명시된 1,000 개의 레코드 이후에 쿼리를 중지 할 수 있습니다. 두 번째 쿼리는 1,001,000 개의 레코드가 생성되어야하고 마지막 1,000 개만 반환되므로 느립니다.

희망이 있습니다.

+0

실제로, 명시 적 순서를 사용하면 MySQL이 순서대로 PK를 사용합니다. 나는 나의 초기 테스트에서 PK 조항에 의한 주문을 시도했으나 타이밍에 아무런 영향을 미치지 않았다. – Xerion

+0

그리고 다른 열 (PK가 아님)을 주문하려고 했습니까? – dgw