2009-08-18 1 views
17

나는 인덱스 컬럼 (들)을 스캔 할 때열 검색 성능을 향상시키는 고유 인덱스가 있습니까? (PGSQL & MySQL은)

CREATE UNIQUE INDEX idx ON tbl (columns); 

는 PostgreSQL을 또는 MySQL의 구현에 중요한 알고리즘 성능 이점을 가지고 대

CREATE INDEX idx ON tbl (columns); 

여부에 대해 궁금하거나, UNIQUE 키워드가 단순히 인덱스와 함께 고유 제한 조건을 도입하는지 여부

나는 한계 장점은 인덱스가 내부적으로 O 이외의 정의 결과에 의해 일부 해시 의 종류 1 -like 구조 및 충돌 처리로 구현 될 가능성이하는 한이 말을 아마 공정 상상 (1) 성능. 이 전제를 감안할 때, 많은 비율의 값이 구조와 선형이 일치하면 선형으로 변질 될 가능성이 있습니다.

그래서, 내 질문의 목적을 위해, 값의 분포는 상대적으로 이산하고 균일하다고 가정합니다.

미리 감사드립니다.

1 RDBM 내부에 익숙하지 않아서 어떤 순수 추측이 필요한가?

답변

15

데이터가 고유하면 UNIQUE 색인을 만들어야합니다.

이것은 추가 오버 헤드가 없으며 어떤 경우 최적화 프로그램의 결정에 영향을 미치므로 더 나은 알고리즘을 선택할 수 있습니다. 예를 들어 SQL Server에서

PostgreSQL에서

, (그들은 관련이 있기 때문에) 당신은 정렬합니다 UNIQUE 키, 옵티마이 저는 그 후 사용 ORDER BY 절을 무시하면, 나는. 이자형. 이 쿼리는 :

SELECT * 
FROM mytable 
ORDER BY 
     col_unique, other_col 
LIMIT 10 

col_unique에 인덱스를 사용하고 것, 그것은 쓸모 종류에 other_col 아니에요 때문이다.

이 쿼리 (A SEMI JOIN 반대) othertable.othercolUNIQUE 인덱스가있는 경우

SELECT * 
FROM mytable 
WHERE mycol IN 
     (
     SELECT othercol 
     FROM othertable 
     ) 

는 또한 INNER JOIN로 변환됩니다.

는 인덱스는 항상 (InnoDB에서, 기본 키/uniquifier MyISAM에서 PostgreSQL에서 ctid, 행 포인터) 행에 대한 포인터의 어떤 종류를 포함하고 사실상 모든 인덱스 리프는 고유하므로 잎은,이 포인터에 정렬 어떤 방법입니다 (분명하지는 않지만).

성능 자세한 내용은 내 블로그에서이 문서를 참조하십시오

2

음, 보통 인덱스는 B-나무가 아닌 해시 (이 해시 기반 인덱스가 있지만 가장 일반적인 지표는 (적어도 PostgreSQL에서는) B 트리의 기반입니다.

속도는 고유해야합니다. 인덱스 스캔에서 지정된 값의 행을 찾으면이 값을 가진 다른 행이 있는지 검색 할 필요가 없으며 즉시 스캔을 완료 할 수 있습니다.

3

고유 제한 조건을 갖는 업데이트/삽입 작업 중 작은 페널티가 있습니다. 고유성 제약 조건을 위반하지 않도록 삽입/업데이트 작업을 검색해야합니다.