글에 오류가 있어 새로운 글을 작성했습니다
- 다음 글을 확인해주세용
최근 데이터베이스 인덱스에 대해 공부를 하고 적용시키는 과정에서 아직 모르는 부분이 있는 걸 발견하였다.
관계형 디비에서 pk를 지정하면 해당 pk는 unique인덱스가 이미 존재한다는 것이었다.. (그것도 모르고 pk에 unique index를 적용하려고 했다)
unique index라고 구글링을 해보면 pk와 unique index를 비교하는 글이 많이 보인다. 그만큼 비슷한 성질을 가지는 것으로 보인다. 그래서 이번 글에서는 pk와 unique index에 대해 적어보려고 한다.
들어가기 전 ..
index는 데이터베이스 조회 성능을 높이기 위한 색인이다. where절에 index로 지정한 컬럼이 들어가면 조회성능 향상을 기대할 수 있다.
여러 개의 컬럼에 대해 지정할 수 있고, 단일컬럼에도 지정이 가능하다.
index는 중복값이 많이 없고, 자주 조회되는 컬럼에 지정해주면 좋지만 너무 남용하면 오히려 성능이 떨어질 수 있기 때문에 신중히 사용해야한다.
Unique index란?
해당 컬럼에 중복값이 들어가지 않을 때 지정하는 인덱스이다.
여러 개의 컬럼에 지정한다면 두 합이 유일해야만 하나의 레코드 생성이 가능하다.
unique 제약조건을 걸어준 것과 비슷하다고 생각할 수 있다.
unique index로 지정된 레코드는 중복될 수 없지만, null이 들어갈 수 있다.
Primary key란?
mysql의 데이터베이스를 설계하려고 하면 항상 Pk를 지정해야했다. 스프링부트에서도 엔티티를 만드려면 pk인 @Id 속성값을 무조건 지정했었다.
pk는 데이터베이스 테이블에서 튜플을 구분하는 유일한 값이다. pk는 유일성과 최소성을 가지는 후보키들 중에서 선정된다.
기본키의 특징
- 테이블 내에서 하나만 존재
- 유일성과 최소성을 만족
- null값을 가질 수 없음 (테이블 내에서 구분되어야 하기 때문)
- 하나 이상의 컬럼이 기본키가 될 수 있음
쉽게 보면 UNIQUE + NOT NULL 제약조건이 PK라고 볼 수도 있다.
기본키가 되는 컬럼 또는 컬럼 그룹에 대해 자동으로 단일의 B-트리 인덱스가 생성된다.
(인덱스로 빠르게 찾을 수 있는 원리)
Pk대신 unique index를 사용할 수 없는 이유
요약하면 두 가지 문제점이 있다.
(1) pk로 조회할 때 성능이 느려짐
(2) null이 들어갈 수 있어 데이터 무결성이 깨짐
이것 외에도 테이블만 봤을 때 pk를 구분하기 힘들어 데이터모델에 대한 파악이 힘들다고 함
조회 성능 문제
테이블 내에 pk가 무조건 존재해야한다고 이론적으로는 말했지만, pk가 없는 경우도 존재한다고 한다.
이 경우에는 디비가 돌아가긴 하지만, 조회 성능이 너무 느려진다고 한다.
이유는 pk에는 기본적으로 uniqueness를 보장하기 위해 unique index가 만들어지기 때문이다.
pk를 기준으로 데이터를 조회하거나, 다른 컬럼의 값을 update, delete 하는 작업은 자주 사용되기 때문에 pk를 지정해주는 것만으로도 where 조건에 pk를 사용하는 쿼리들의 성능이 현저하게 향산된다.
데이터 무결성 문제
pk를 지정하지 않는다면 중복데이터가 저장되어 데이터 무결성이 손상될 수도 있다.
데이터모델 파악 어려움 문제
unique index는 한 테이블에 한 개 이상 만들 수 있기 때문에 테이블만 보고 pk를 구분하기 힘들다.
또한 리버스 엔지니어링으로 데이터모델을 파악할 때 PK가 있어야 한 눈에 알아보기 좋다고 한다.
pk대신 unique 인덱스를 사용하면 pk/fk가 없어 DBA가 데이터베이스를 관리하기 쉽고, 개발 시점에 데이터 제약이 없어 개발 및 유지보수가 조금 더 편하며, PK/FK를 사용하지 않아 성능이 좋아질 수 있다는 장점도 있다고 한다.
하지만 다른 단점들이 존재하고, PK를 사용할 때 FK인덱스를 적절하게 설정해주면 염려할만큼 과도한 성능저하도 없다고 한다.
(개발자들이 PK/FK를 설정할 때 인덱스를 생성하는 노하우를 안다면 굳이 성능문제 때문에 UNIQUE INDEX를 사용할 필요도 없다고 함)
데이터 모델링할 때 가장 중요한 점
- 데이터 무결성
- 데이터베이스 성능
- 데이터베이스 관리의 용이성
- 개발자의 편의성
이 4가지 기준에 의해 판단하여 데이터베이스 모델링을 하는 게 좋다고 한다.
PK를 사용하지 않으면 가장 중요한 데이터 무결성이 데이터베이스가 아닌 어플리케이션에게 맡겨지게 된다. 그러면 추후에 문제가 생길 수 있고, 데이터 무결성이 깨질 위험도 존재한다.
+) UNIQUE INDEX에 NOT NULL을 붙이면 PK와 동일한 제약조건으로 만들 수 있지만, PK를 사용하여 관계를 명확하게 지정하는게 더 좋음.
결론
- 테이블당 PK는 필수로 지정해줘야한다! UNIQUE INDEX와는 다름
- PK는 unique 인덱스가 자동으로 부여되어 성능향상에 도움이 된다. pk에 굳이 unique index를 붙이려는 생각을 하지말자
참고자료
https://linuxism.ustd.ip.or.kr/503
http://www.gurubee.net/article/42590
'database' 카테고리의 다른 글
Programmers SQL 고득점 Kit 풀기(2) (2) | 2025.01.13 |
---|---|
Programmers SQL 고득점 Kit 풀기(1) (2) | 2025.01.10 |
위키만들기 - 글의 history를 저장하는 방법 (0) | 2023.08.08 |
[MySQL, MariaDB] procedure(프로시저) 생성, 수정, 삭제 (0) | 2023.02.06 |
ORM(Object Relational Mapping)이란? (4) | 2022.10.02 |