2010-06-26 3 views
1

데이터베이스 테이블에 대해 두 개의 쿼리가 있다고 가정합니다.부분 키와 데이터베이스 테이블의 인덱스에 대한 질문

에 Query1 :

쿼리

쿼리에 사용되는 필드의 관점에서 정의된다 F1, F2에 의존하고, F3

QUERY2는 : F1, F2, F3 및 F4에 따라

SQL 쿼리 엔진 (이 경우에는 mySQL)이 인덱스의 가장 왼쪽 필드부터 시작하여 인덱스 트리를 구문 분석한다는 것을 기억합니다.

Index 1 (for Query1) : CREATE INDEX idx_1 {f1, f2, f3} 
Index 2 (for Query2) : CREATE INDEX idx_2 {f1, f2, f3, f4} 

단순히 두 쿼리에 사용되는 키의 조합을 포함하는 하나의 인덱스를 정의 할 수 있습니다 : - 즉 올바른 경우

, 그럼 내가 대신 같은 테이블에 정의 된 두 개의 인덱스를 가진의 가정 즉

나는 단지이 인덱스 정의 할 필요가

:

:

(for BOTH Query1) : CREATE INDEX the_idx {f1, f2, f3, f4} 

내가이 개 질문을

  1. 내 가정이 맞습니까? 즉 이전의 두 인덱스 대신에 하나의 인덱스 (the_idx)를 정의 할 수 있습니까?

  2. PostgreSQL 쿼리 엔진에서도이 인덱스 동작이 true로 유지됩니까?

+0

이 가정은 다른 유형의 인덱스가 아니라 B-TREE에 관한 것입니다. Wikipedia에는 ​​HASH, GIN, GIST, RED-BLACK 등의 정보가 있습니다. 데이터베이스의 매뉴얼도 참조하십시오. 인덱스의 구현에 대한 자세한 정보가 있습니다. –

답변

1

내 가정이 맞습니까? 즉 이전의 두 인덱스 대신에 하나의 인덱스 (the_idx)를 정의 할 수 있습니까?

예.
이것은 커버 인덱스 (covering index)라고 불리며, 쿼리를 가장 많이 사용하는 컬럼을 정렬하고자합니다. IE : F2가 가장 일반적인 열이있는 경우, 당신은 사용하고자하는 것 :

CREATE INDEX the_idx {f2, f1, f3, f4} 

이 인덱스 동작뿐만 아니라 PostgreSQL의 쿼리 엔진에 대한 진정한 보유하고 있는가?

아니요, Postgres does not support covering indexes.

인덱스는 ANSI 표준이 아닙니다. 용어가 그대로 공급 업체간에 일관된 기적입니다.

0

일반적으로 채워지는 색인이 더 유용 할 것입니다. 그러나 색인에 더 많이 추가할수록 더 많은 오버 헤드가 필요합니다.

가장 좋은 방법은 시도하고 실행 계획을보고 원하는 방식으로 사용되는지 확인하는 것입니다.

결과 집합에 반환되는 실제 열에 따라 더 짧은 인덱스를 사용하는 것이 더 유용 할 수 있습니다.

0

MySQL manual은 그렇습니다. 해시 색인이 아닌 모든 색인에서 키의 모든 "접두사"를 검색 할 수 있다는 것이 합리적으로 분명합니다.

PostgreSQL에 대한 비슷한 문서를 찾을 수 없지만 항상 테이블을 만든 다음 EXPLAIN (어쨌든 나쁜 생각이 아닙니다)을 수행 할 수 있습니다.