2011-08-23 7 views
4

나는 열이 10 개인 테이블을 가지고 있으며 대부분의 경우 결합 된 범위 필터를 지원해야합니다. 나는 다른 열로 정렬 데이터를 지원하는 것이 필요MySQL 인덱스 생성

WHERE column_a >= a_min AND column_a <= a_max 
AND column_b >= b_min AND column_b <= b_max 
... 

을하지만 그 모든되지 않습니다 :

의 예를 들어 가정 해 봅시다.

제 질문은 검색을 최적화하기 위해 만들 수있는 가능한 색인 조합이 엄청나다는 것을 고려하면 가능한 옵션은 무엇입니까?

감사합니다.

+2

유일한 것은 - N 단일 인덱스 (열당 1)를 만드는 것입니다. 어떤 대안이 궁금해서 대답을 넣지 마십시오. – zerkms

+0

@sebasuy, 당신은 당신의 테이블을 얼마나 기대하고 있습니까? 상대적으로 작은 테이블의 경우 색인을 통해 액세스하는 대신 테이블을 스캔 할 때 실제로 성능이 더 좋을 수 있습니다. –

+0

@ 마크, 테이블에는 많은 레코드가있을 것이고, 나는 6에서 1,000 만 사이라고 추산합니다. 감사. – sebasuy

답변

4

각 열에 대해 개별적으로 색인을 작성하십시오. mysql이 어떻게 사용하는지 알아 보자.

column_a between a_min AND a_max 

보다는 :

column_a >= a_min AND column_a <= a_max -- ugly and the semantic is not as obvious 

그것은 읽고 형보다 쉽게 ​​정확하게 을 수행


또한, 보조 노트에, between 연산자를 사용하는 습관을
같은 것.

+0

+1하지만 'BETWEEN'에 대한 귀하의 의견에 동의하셔야합니다. '=>'AND '<='는 'BETWEEN'보다 명확합니다. (나는 어느 누구도 그렇게 질문하지 않는다고 생각한다. => AND <= 범위 경계를 포함한다) –

+0

나는 Kevin에 동의한다. 답해 주셔서 감사합니다, +1. – sebasuy

+0

나는이 "사이에"연산자를 알지 못했다. 정말 언급했기 때문에 기쁩니다! – AsTeR

0

쿼리에 사용 된 모든 열에 대한 인덱스를 만듭니다.

(column_a, column_n) 여기에 여러 부분으로 인덱스에 대한

볼 수있는 범위 액세스 방법 : 당신이 할 수있는 http://dev.mysql.com/doc/refman/5.0/en/range-optimization.html

+0

그는 모든 필드와 평등 비교를하지 않는 한 - 복합 인덱스를 제공 한 링크에 따라 ** 작동하지 않습니다 ** (또는 정확하게 말하면 첫 번째 인덱스 열만 사용됩니다) – zerkms