300x250
Primary Key(PK)가 2개 이상의 컬럼으로 구성된 경우, 이를 복합 Primary Key라고 합니다.
복합 PK를 생성하면 해당 컬럼 조합에 대해 자동으로 **복합 인덱스(Composite Index)**가 생성됩니다.
이 인덱스는 두 컬럼의 조합을 기반으로 정렬되고 검색 성능을 최적화합니다.
복합 Primary Key의 인덱스 작동 방식
- 복합 PK는 두 개 이상의 컬럼 조합으로 고유성을 보장합니다.
- 데이터베이스는 복합 PK를 생성하면서 자동으로 해당 컬럼 조합에 대해 B-Tree 인덱스를 생성합니다.
- 이 인덱스는 아래와 같이 작동합니다:
- 첫 번째 컬럼(선행 컬럼): 인덱스는 주로 첫 번째 컬럼 값을 기준으로 정렬됩니다.
- 두 번째 컬럼(후행 컬럼): 첫 번째 컬럼 값이 동일할 때 두 번째 컬럼 값으로 정렬됩니다.
복합 PK 생성 예제
테이블 생성
CREATE TABLE Orders ( order_id INT, product_id INT, quantity INT, PRIMARY KEY (order_id, product_id) );
자동 생성된 인덱스
위 쿼리를 실행하면 (order_id, product_id)에 대해 복합 인덱스가 생성됩니다.
복합 인덱스의 특징
- 선행 컬럼과 후행 컬럼의 역할:
- 인덱스는 선행 컬럼(order_id) → 후행 컬럼(product_id) 순서로 정렬됩니다.
- 예를 들어, order_id가 101인 모든 행을 먼저 찾고, 그중에서 product_id를 기준으로 검색합니다.
- 단일 컬럼 조건 사용:
- 선행 컬럼(order_id)만 조건에 사용될 경우 인덱스가 활용됩니다.
- 하지만 후행 컬럼(product_id)만 조건에 사용되면 인덱스를 사용할 수 없습니다.
예제
-- 선행 컬럼 사용: 인덱스 활용
SELECT *
FROM Orders
WHERE order_id = 101;
-- 선행 및 후행 컬럼 사용: 인덱스 활용
SELECT *
FROM Orders
WHERE order_id = 101 AND product_id = 202;
-- 후행 컬럼만 사용: 인덱스 비활용
SELECT *
FROM Orders
WHERE product_id = 202;
- 인덱스의 활용 범위:
- 복합 인덱스는 첫 번째 컬럼(선행 컬럼)을 반드시 포함해야 효과적으로 동작합니다.
- 후행 컬럼만으로는 인덱스의 효율성이 제한됩니다.
복합 PK의 장단점
장점
- 다중 컬럼 조합을 통해 고유성을 보장합니다.
- 특정 조건(선행 컬럼과 후행 컬럼 조합)에 대해 성능을 최적화합니다.
- 별도의 인덱스를 생성하지 않아도 자동으로 복합 인덱스를 제공합니다.
단점
- 후행 컬럼만 검색 시 인덱스 활용이 제한됩니다.
- 복합 PK가 많아지면 인덱스 크기가 커져서 삽입/삭제 성능에 영향을 줄 수 있습니다.
복합 PK를 설계할 때 고려할 점
- 컬럼 순서:
- 가장 자주 사용되는 검색 조건을 선행 컬럼으로 설정해야 인덱스 활용도가 높아집니다.
- 유일성 필요성:
- 복합 PK로 고유성을 보장하려면 두 컬럼 조합이 실제로 고유해야 합니다.
- 인덱스 추가 여부:
- 후행 컬럼 단독 검색이 빈번하다면 해당 컬럼에 별도 인덱스를 추가로 생성하는 것이 좋습니다.
예제: 후행 컬럼에 인덱스 추가
CREATE INDEX idx_product_id ON Orders (product_id);
요약
- 복합 PK는 여러 컬럼을 조합하여 고유성을 보장하며, 데이터베이스는 자동으로 복합 인덱스를 생성합니다.
- 인덱스는 선행 컬럼을 우선적으로 활용하며, 설계 시 검색 조건에 따라 컬럼 순서를 신중히 결정해야 합니다.
- 후행 컬럼 단독 검색이 많다면 별도의 인덱스를 추가로 생성하는 것이 성능 향상에 도움이 됩니다.
300x250
'IT > DB' 카테고리의 다른 글
데이터베이스 SQL에서 다음행 찾는 LEAD( ) OVER ( ) 함수 (0) | 2024.11.23 |
---|---|
mysql workbench 자동 대문자 변환하는 방법 (0) | 2024.11.21 |
pk 1개 테이블과 2개 테이블의 차이점 (0) | 2024.11.19 |
데이터베이스 sql 월별 평균 건수 조회 쿼리 AVG 함수 (0) | 2024.11.17 |
큐브리드 sql replace 공백 구분탭 추가하는 방법 CHAR(9) (1) | 2024.11.14 |