2012-04-20 2 views
0

테이블 팀은 1169 개의 ​​행을 포함하며, 1133은 UserId 필드! = 0을가집니다.왜 count를 선택하면 많은 행을 가져 옵니까?

쿼리은 "사용자 아이디"필드에 인덱스가 :

EXPLAIN SELECT count(*) FROM teams WHERE UserId != 0

행의 견적을 가지고

반환 출력을 검사하는 동일한 1133

에 쿼리 필요가 모든 행을 검사하는 이유 ? 이 목적으로 인덱스 만 사용하면 안됩니까?

감사합니다.

+2

SELECT COUNT (사용자 ID)를 사용해 보셨습니까? – Hajo

+0

인덱스 항목의 수가 맞지 않습니까? 클러스터 된 인덱스를 기억하면 테이블 IS가 인덱스입니다. – Ben

답변

1

UserId! = 0이라고 말했기 때문에 거의 모든 행을 원하므로 거의 모든 행을 검사합니다. 물론, 당신은 하나의 레코드 만 보여줄 수 있도록 "카운트"를 만들었지 만, 그것들을 계산하려면 모두 가져와야 만했다. (! = 전년 동기 대비 사용자 ID 반대로 사용자 아이디 = XX)는 정확한 값을 요구하기 때문에 당신이

select count(1) from teams where UserId = 100 

을 수행하는 경우 다음은 몇 행 ONY 검토 할 것이다.

+1

오, 알겠습니다 ... 고마워. – Budda

+0

하지만 왜 COUNT (1)를 사용 했습니까? COUNT (*)와 다른 점은 무엇입니까? – Budda

+0

@Budda 이전에 *를 사용하여 전체 행 구조를 가져 와서 계산 했으므로 count (임의의 상수)를 사용하면이를 피할 수 있습니다. 이것은 아마도 현재의 DBMS의 경우는 아니지만 습관이 있습니다. 어쨌든, 내 대답의 importat 것은 "UserId = xx"와는 대조적으로 "UserId = xx"입니다. 나는 명확히하기 위해 응답을 편집 할 것이다. –

관련 문제