2013-05-12 2 views
1

저는이 두 쿼리에 대해 혼란 스럽습니다. 쿼리 속도가 불안정합니다. 여기 내 두 테이블 구성표입니다.두 개의 불안정한 쿼리 성능

게시물 테이블 (ID, 제목, 날짜 등) [날짜 인덱스]

관계 테이블 (news_id, relation_id) 모두와 행 당이 인덱스]

쿼리 A :

SELECT * 
FROM posts 
WHERE id IN (
    SELECT news_id 
    FROM relationships 
    WHERE relation_id IN (?) 
) 
AND status = 1 
ORDER BY `date` DESC 

쿼리 B :

SELECT * 
FROM posts AS p 
INNER JOIN relationships AS r ON r.news_id = n.id 
WHERE r.relation_id IN (?) 
AND n.status = 1 
ORDER BY n.date DESC 

이제 이상한 부분은 테스트 결과입니다; 먼저 30 개의 행을 갖는 relation_id를 시도합니다.

쿼리 A : 30 총, 쿼리 5.56 초를

쿼리 B에 나섭니다 : 30 총, 쿼리

A가 적은 행에 느린 0.03 초를했다, B 적은 행에 속도입니다. 다음으로 3k 개의 행이있는 relation_id를 시도합니다.

쿼리 A는 : 3850 총 조회

그래서 이것은 더 빠른 지금 더 많은 데이터와 함께, 나를 혼란 0.70 초에 나섭니다 : 3,850 총, 쿼리는 초

쿼리 B 0.05했다. 마지막으로 하나의 + 10k 행을 가진 다중 relation_id를 시도합니다. 예; relation_id IN (1, 2, 3, 4)

쿼리 A : 18,906 총 쿼리 0.01 초

했다

쿼리 B : 18,906 총, 쿼리

그래서 어떻게해야합니까 3.34 초

했다? 쿼리 A는 많은 행의 속도이지만 적은 행의 경우 느립니다. 이 검색어에 대한 다른 추천 방법은 없나요? (내 나쁜 영어 문법 실수 죄송합니다)

편집 여기

SQL이들 EXPLAIN이다;

30 행 와

조회 30 행 와 Query A with 30 rows

쿼리 B query B

쿼리 A의 18K 행 query b 2

+0

30 행 예제와 큰 예제에 대한 설명을 제공 할 수 있습니까? '어디서 '에 5 초가 걸리지 않아야합니다. 당신이 측정을 방해하는 다른 질문이 확실하지 않습니까? 반복 할 수 있습니까? – flaschenpost

+0

'posts.id'에 색인이 있습니까? –

+0

@JoachimIsaksson 예, 주 – musa

답변

0

매우 이상과 18K 행 query a

쿼리 B ,하지만 그게 MySQL이야 ;-)

옵티마이 저는 status = 1이 강력한 제한이라고 생각합니다. 즉 보유하면 테이블의 단지 작은 부분은 여전히 ​​다음 30 행 솔루션을 status=1을 가지고보기의 mysqls 관점에서 매우 좋은 경우에, 당신은

select status=1, count(*) as num from posts group by status=1 

에 의해 얻을.

큰 부분이 status = 1이있는 경우 다음

from posts ignore index (status) ... 

또는

from posts force index (id) ... 

은 어디에 -에 - 솔루션을 적용하기로 쿼리를 시도해야합니다.

더 자세한 정보는 옵티마이의 인덱스 통계를 기반으로 기대한다 크기를 보여줍니다

explain select count(*) from relationships where relation_id in (1) 

를 통해 얻을 수 있습니다.

고정 색인 힌트의 문제점은 고정되어 있다는 것입니다. 그것은 그들이 좋은 시나리오와 나쁜 시나리오에 적용된다는 것을 의미합니다.

가끔 임시 테이블을 사용하면 관련 관계를 저장할 수 있습니다.

+0

실제로, 나는 "위치"와 "순서"없이 병목을 주문과 같이 보지 않고 시도했습니다. "order by"가없는 쿼리 B는 + 10k 행으로 0.0082 초 걸렸습니다. – musa