2013-03-29 6 views
2

다음 질문에 대한 간결한 답변을 찾으려고 노력했지만 많은 것을 읽었지 만 여전히 확실하지 않습니다. 시나리오가 매우 다를 수 있기 때문에 단순한 대답이 없을 수도 있습니다.mysql 인덱싱 성능

1) 나는 모든 레코드 중 하나를 0 또는 1 TINYINT 열 수 있습니다 인덱스해야 여기서

그러나 여기이 질문입니까? postActive 열이 0 또는 1로 모든 레코드가

예 검색어 :

SELECT postId, postName, postTitle 
FROM postTable 
WHERE postDate > Now() 
AND postActive = 1 

2) 해야하는 그 모든 기록이 대체 int 값이 기록을 제외하고 0을 가지고있는 int 열입니다 인덱스 테이블에서 유일합니까? 이 예

는 열 orderProcessingId은 (제로 이외) 테이블 100 % 고유 될 것, 및 기록의 대다수는 orderProcessingId 0을 갖는다.

SELECT orderId, orderInformation, orderData, orderStuff 
FROM orderTable 
WHERE orderProcessingId = 38457237 

이 두 테이블에는 수십만 개의 레코드가 있습니다.

나는 색인 생성이 성능을 향상시키기 위해 상대적으로 분산 된 빈도 값에 의존하기 때문에 문제가되는 것 같아요. 그러나 예제 1에서는 두 값 모두 극도로 높은 값을 가지며 예제 2에서는 하나의 값 (0)의 매우 높은 빈도와 예외의 반복 빈도가 없습니다.

하지만 내 생각은 모두 추측에 기반을두고 있습니다. 뭐라 구요?

답변

3

나는 색인 생성이 성능 향상을 위해 상대적으로 분산 된 빈도 값에 의존하기 때문에 문제가되는 것 같습니다.

반드시 그렇지는 않습니다.

모든 레코드가 0 또는 1 인 tinyint 열을 인덱스해야합니까?

이러한 값의 분포가 거의 같은지 여부에 따라 달라지며, 발생하는 값이 크게 적은지 여부에 따라 결정됩니다.

해야하는 I 인덱스 모든 레코드는 테이블의 고유 한 대체 int 값이 기록을 제외하고 0을 가지고있는 int 열?

희귀하고 고유 한 값 중 하나를 검색하려고하므로 - 예.

은 (난 당신이 BTW, 여기 0NULL을 혼동하지 않는 희망 -. 당신의 정수형 항목 값 0있는 사람을 제외하고 독특한한다면, 당신은 여기에 UNIQUE 인덱스를 사용할 수 없기 때문에.)

+0

감사 CBroe을 . 첫 번째 예에서 대부분의 레코드는 1입니다. 그러나 700k 1과 400k 0과 비슷합니다. 나는 항상 1에 관심이 있습니다. 예를 들어 2, 더 나은 성능을 위해 Null을 허용하고 고유 인덱스를 사용해야한다고 말하고 있습니까? (지금은 0과 일반 인덱스를 사용하고 있습니다) – userlite

+0

700k 1과 400k 0의 경우 인덱스에 따라 속도가 느려질 수도 있습니다. 1 % 1 %, 99 % 0 %이면 MySQL은 대부분의 경우 올바른 작업을 수행합니다 (1을 선택했을 때만 인덱스 사용). – Vatev

+1

글쎄, 이런 질문에 대한 거의 모든 대답에서 _ "의존한다"가있다. 확실하게 지금은 묻는 사람은 실제로 어떤 효과가 있는지 알아보기 위해'EXPLAIN'을 시도하고 측정하고 사용해야합니다. – CBroe