2010-02-26 4 views
0

mysql (innodb)은 (A) 또는 (B)와 같은 쿼리를 더 빠른 속도로 지원할 수 있습니까?MySQL innodb는 연속 읽기와 tradeoff를 비교한다

(A) (A)에서 SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300

는, 기본 키 (800 개)의 행의 범위를 선택한다. "x"는 색인화되지 않습니다. 하나의 범위 조회와 길이 200kb의 연속 읽기가 있습니다.

(B) (B)에서 (SELECT * FROM t1 WHERE pkey BETWEEN 2000 and 2001 AND x > 300) UNION ALL (SELECT * FROM t1 WHERE pkey BETWEEN 3000 and 3001 AND x > 300)

는, 기본 키 (200 개)의 행의 범위를 선택한다. "x"는 색인화되지 않습니다. 두 개의 범위 조회와 길이 50kb의 두 연속 읽기가 있습니다.

요약하면 (A)는 디스크 탐색을 2 배지만 연속 읽기는 1/2로 계산합니다. 반대로 (B)는 디스크 탐색의 절반이지만 인접 판독의 2 배입니다.

일반적으로 검색 속도가 느리고 인접 읽기가 빠르다고 가정합니다. 그러나 추가 검색 10MB를 통해 읽는 것이 더 바람직하다고 가정합니다. 대략적으로 트레이드 오프 지점은 어디입니까?

+0

두 쿼리는 논리적으로 동일하지 않습니다. B는 A에 포함되지 않은 3000..3001 범위를 포함합니다. – Martin

+0

데이터가 두 시나리오에서 다르게 정렬되므로 쿼리 결과가 동일합니다. 그것은 더 명백해야했습니다; 나는 그 질문을하는 아주 좋은 일을하지 않았다. 나는 이것이 이론적으로 이것을 풀려고 시도하는 것을 멈추고 두 가지 접근법을 벤치마킹한다고 생각한다. –

답변

0

옵티마이 저는 쿼리 구현 방법을 결정해야합니다. 원하는대로 작성하십시오.

대략적인 결과를 보려면 EXPLAIN을 사용하십시오. pkey의 인덱스에서 두 개의 범위 스캔을 수행하는 것일 수 있습니다.

일반적으로 적은 수의 행을 읽는 것이 좋습니다. 버퍼 풀에서 더 많은 것을 유지할 수도 있습니다. 일반적으로 두 가지 범위 스캔이 하나보다 좋습니다.

나는 테이블 t1이 완전히 메모리에 맞지 않는다고 가정하고 있는데, 대부분 학문적이다.

0

당신은 실제로 두 가지 옵션을 EXPLAIN의 출력으로 보완 할 필요가 있습니다. 이론적으로 더 빠르면 MySQL이 사용할 수있는 최적화가 중요합니다.

내가 당신을 위해 맞춰 볼까 : 그것은 클러스터 된 인덱스에 있기 때문에

가)였다 PKEY 조회는 매우 효율적입니다. 범위 안에있는 모든 것에 대해 "next, next next"라고 읽으면 X가 일치하는지 확인합니다.

b) 일련의 요점 검색입니다. 그러나 결과가 당신에게 전달 될 수 있다고 생각하더라도 임시 테이블이 생성됩니다. (!) http://www.facebook.com/note.php?note_id=276225210932

내 표결은 거의 확실합니다.