IT/DB
외래키와 인덱스 관계는?
RM_
2025. 5. 12. 12:28
728x90
반응형
외래키(Foreign Key)와 인덱스(Index)는 서로 다른 개념이지만, 성능 및 무결성 유지 측면에서 밀접한 관계가 있습니다.
✅ 기본 개념 정리
개념 | 설명 |
외래키 (Foreign Key) | 다른 테이블의 기본키(또는 유니크 키)를 참조하는 제약 조건 (무결성 유지 목적) |
인덱스 (Index) | 데이터를 빠르게 찾기 위한 자료구조 (성능 향상 목적) |
🔗 외래키와 인덱스의 관계
🔸 1. **참조 대상 칼럼(=부모 테이블 키)**에는 인덱스가 반드시 있어야 함
- 외래키는 부모 테이블의 기본키나 유니크 인덱스 컬럼만 참조 가능
- 즉, 외래키는 기본적으로 인덱스를 가진 컬럼만 참조할 수 있음
🔸 2. **외래키 칼럼(=자식 테이블의 참조 컬럼)**에는 인덱스가 자동 생성되지 않음
- 대부분의 DBMS(MySQL, PostgreSQL 등)는 외래키 선언 시 자동 인덱스를 만들지 않음
- 하지만 DELETE, UPDATE, JOIN 시 성능 문제가 생길 수 있음
- 👉 따라서 실무에서는 외래키 칼럼에 수동으로 인덱스를 생성하는 것이 일반적
⚠️ 외래키 인덱스 미존재 시 문제점
상황 | 결과 |
부모 테이블에서 삭제할 때 | 자식 테이블 전체 스캔 (성능 저하) |
JOIN할 때 | 외래키 컬럼 검색 속도 느림 |
데이터 무결성 체크 | 전체 탐색 필요로 성능 손실 가능 |
✅ 실무 팁: 외래키에는 인덱스를 수동으로 생성하자
예:
-- 고객 테이블
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- 주문 테이블 (외래키 + 인덱스)
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
-- 외래키 컬럼에 인덱스 추가
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
✅ 요약
항목 | 설명 |
외래키는 참조 대상이 인덱스(보통 PK/UK)여야 함 | ✅ 필수 |
외래키 컬럼에는 인덱스가 자동 생성되지 않음 | ❌ 수동으로 생성 필요 |
외래키 + 인덱스 조합 | ✅ 성능 향상 및 무결성 유지에 필수 |
300x250
반응형