DATA 전문가로 가는 길

[Admin] MySQL/MariaDB Primary Key vs Unique Key 본문

Data Architecture/Admin

[Admin] MySQL/MariaDB Primary Key vs Unique Key

EstenPark 2020. 7. 2. 15:30

1. Primary Key 란

 

Primary Key는 데이터베이스 행을 고유하게 식별할 수 있는 습니다. 테이블 단일 컬럼으로 식별할 수 있고, 복합 컬럼으로 식별할 수 있는데 성능적으로는 단일 컬럼으로 생성해야 Clustered Index를 견고하게 사용 가능합니다. 또한 NULL을 허용하지 않으며, 데이터에 대한 일관성을 보장합니다. 데이터 중복이 발생하지 않아 빠르게 쿼리를 수행 가능합니다. 

 

InnoDB engine기준으로 Primary Key는 항상 Clustered Index이며, Primary Key가 존재하지 않을 경우 Unique Key(Unique Index)를 선택하게 됩니다. 후보가 없을 경우 Auto_Increment 속성의 컬럼을 활용하게 되는데 이는 테이블에 Primary Key를 생성하지 않으면 시스템 적으로 고유값을 찾아서 그 값을 생성하게 됩니다.

 

2. Unique Key(Unique Index) 란

 

Unique Key는 데이터베이스 행을 고유하게 식별할 수 있는 구조는 동일하지만, NULL 허용하게 되면 중복된 데이터를 가질 수 있습니다. 대체적으로 논리적으로 보조 식별자를 구분하기 위해서 사용하게 되며, 테이블 기준으로 여러 개를 생성 가능합니다. 

 

InnoDB 기준으로 Unique Key는 Non-Clustered Index입니다.

 

3. Primary Key와 Unique Key 차이점

Primary Key Unique Key
테이블에 반드시 하나만 존재  테이블에 여러 개 존재 가능
NULL 허용 하지 않음 NULL 허용 가능
기본 Clustered Index 기본 Non-Clustered Index
데이터 무결성 보장 데이터 무결성 보장(NULL은 여러 개 존재 가능)
CREATE TABLE employee
(
emp_no int PRIMARY KEY,
name varchar(255), 
city varchar(150)
) ;

CREATE TABLE employee
(
emp_no int PRIMARY KEY,
emp_id  int,
name varchar(255), 
city varchar(150)
)
;

CREATE UNIQUE INDEX employee_idx01
                          ON employee(emp_id);
제약 조건(constrainnt) 제약 조건 없음

 

4. Primary Key 반드시 필요한가?

 

데이터 모델링 관점

관계형 데이터베이스에서 릴레이션을 가지기 위해서는 반드시 필요합니다. 만약 부서와 사원 엔티티가 존재한다고 할 때 부서 엔티티에 식별자를 "부서 코드"를 사원 엔티티에서 부서 코드를 FK로 참조 가능합니다. 부서 엔티티에 식별자가 존재하지 않는다면 이렇게 릴레이션이 연결될 수 없게 됩니다. 

 

데이터 관점

테이블에 Primary Key가 존재하지 않는다면 중복된 데이터로 인해 데이터 정제 작업이 필요하며, 각 컬럼에 값을 어떤 우선순위에 따라 결과를 추출해야 합니다. 데이터 품질 향상에 도움을 줄 수 있습니다. 

 

성능 관점

Primary Key를 생성하게 되면 최소의 Cost를 사용할 수밖에 없습니다. MySQL, MariaDB의 InnoDB engine은 기본적으로 데이터를 저장할 때 인덱스를 활용하기 위해서 후보가 될 수 있는 Primary Key를 생성하게 됩니다. InnoDB engine은 Unique 값을 가진 컬럼을 찾아서 보이지 않는 Clustered Index를 만들게 됩니다. 

 

동기화 관점(HA)

MHA는 데이터 동기화를 진행할 때 테이블 PK 기준으로 맞추게 됩니다. 또한 db compare 유틸리티를 할 때도 Primary Key 기준으로 양쪽 데이터를 비교해서 INSERT, UPDATE, DELETE를 추출하게 됩니다. 양쪽 데이터를 비교할 때 모든 컬럼을 기준으로 비교해서 데이터를 이관한다고 하면 그만큼 성능 저하가 발생하게 됩니다.

 

결론

Primary Key는 선택 사항이 아니라 필수 사항입니다.

 

5. Primary Key 조건

  • 유일한 값을 가질 수 있는 컬럼
  • Null을 허용하지 않은 컬럼
  • 데이터 변경이 발생하지 않은 컬럼
  • int, bigint datatype 형태 컬럼(auto_increment와 같이 순차적으로 생성)
  • 업무적 유일한 컬럼(사원번호, 부서코드, 종목번호, 회원ID 등)

6. 참고

Comments