주요 키의 종류
기본키 = Primary Key
기본키는 테이블에서 각 레코드를 고유하게 식별할 때 사용되는 하나 이상의 컬럼이다. 기본키는 중복된 값이 없으며, NULL 값을 가질 수 없다는 특징을 가진다. 이때, 중복된 값이 없는 특성은 유일성이라고도 한다.
기본키는 설정 시 자동으로 인덱스가 함께 생성되기 때문에 검색 성능을 높여주는 역할을 한다. 예를 들면, 테이블에서 특정 레코드를 찾을 때 기본키를 이용하면 더 빠르게 조회할 수 있다.
후보키 = Candidate Key
후보키는 기본키가 될 수 있는 모든 컬럼 집합을 말한다. 즉, 각각의 후보키는 유일성을 만족하고 NULL 값도 가질 수 없다. 여러 개의 후보키가 있을 수 있지만, 기본키는 단 하나만 존재하기 때문에 후보키 중 단 하나만 기본키로 선정된다.
슈퍼키 = Super Key
슈퍼키는 한 테이블에서 레코드를 고유하게 식별할 수 있는 컬럼 집합을 의미한다. 후보키는 최소한의 컬럼 집합으로 유일성을 보장한다. 또한, 슈퍼키는 유일성을 보장하는 컬럼 집합 중에서 불필요한 컬럼을 포함할 수 있다.
기본 키 수정 가능 여부
기본키는 수정이 가능하지만, 수정에 주의가 필요하다. 기본키는 레코드를 고유하게 식별하므로 기본키를 수정하면 데이터 일관성에 영향을 미칠 수 있다. 기본키를 수정하는 경우, 참조하는 다른 테이블의 외래키 값도 함께 수정해야 할 수도 있다. 그래서 일반적으로 기본키를 수정하는 것보다는 새로운 레코드를 추가하여 기존 레코드를 삭제하는 방식으로 처리하는 것이 더 안전하다.
기본 키 없이 테이블 생성이 가능한 이유
MySQL에서는 기본키 없이 테이블을 생성할 수 있다. 왜냐하면 기본키가 필수가 아니기 때문이다. 기본키가 없으면 MySQL에선 데이터의 고유성이나 무결성을 보장하지 않지만, 테이블을 생성하는 데는 문제가 없다. 그러나 기본키 없이 테이블을 운영하게 되면 데이터의 무결성 문제가 발생할 수 있으며 성능 측면에서도 불리하다. 왜냐하면 기본키가 없으면 MySQL이 자동으로 Primary Index를 생성하지 않기 때문이다.
외래키 값에 NULL이 들어올 수 있는가?
외래키 값에는 NULL이 들어올 수 있다. 외래키는 다른 테이블의 기본키를 참조하는 컬럼이다. 외래키가 NULL 값을 가질 수 있는 경우는, 해당 외래키가 참조하는 값이 없거나 해당 관계가 선택적일 때이다.
UNIQUE 키워드가 붙은 컬럼의 쿼리 성능
UNIQUE 키워드를 특정 컬럼에 정의하면 해당 컬럼의 값을 유일하게 유지하도록 한다. UNIQUE 키워드가 붙었을 때와 붙지 않았을 때의 차이는 아래와 같다.
- 검색 성능 향상하지만 UNIQUE 키워드가 붙지 않은 컬럼을 조건으로 검색을 하게 되면 Full Table 스캔이 발생할 수 있어서 검색 성능에 있어서 불리할 수 있다.
- UNIQUE 제약 조건이 있는 컬럼에 대해 DB는 고유 인덱스를 생성한다. 해당 인덱스를 사용하면 해당 컬럼을 조건으로 검색할 때 데이터를 빠르게 찾을 수 있다.
- Insert 및 Update 할 때 Overhead 가능성
- UNIQUE가 설정된 컬럼에 데이터를 삽입하거나 업데이트 할 때 DB는 새로운 값이 기존 값과 중복되지 않는지 검사해야 한다. 그래서 삽입 및 업데이트 작업을 하면 성능이 저하될 수 있다.
- 데이터 무결성 보장
- UNIQUE 제약 조건은 중복된 값이 들어가는 것을 방지하기 때문에 데이터 무결성을 보장한다. 그래서 중복 데이터를 처리할 필요가 없어서 간접적으로 운영 및 분석 쿼리의 성능과 효율성에 기여한다.
- 다중 컬럼의 UNIQUE
- 여러 컬럼을 조합한 UNIQUE 키를 생성하면 해당 조합에 대해 복합 인덱스(Composite Index)가 생성된다. 복합 인덱스는 다중 컬럼 조건의 검색 성능을 향상시키지만 인덱스 생성 및 유지 관리로 인한 추가 비용도 발생시킨다.
'CS' 카테고리의 다른 글
[운영체제] 인터럽트 Interrupt (0) | 2025.01.29 |
---|---|
신입 개발자 CS 면접 대비 질문-ECT #1 (0) | 2023.02.23 |
신입 개발자 CS 면접 대비 질문-네트워크 #1 (0) | 2023.02.14 |
신입 개발자 CS 면접 대비 질문-운영체제 #2 (0) | 2023.02.12 |
신입 개발자 CS 면접 대비 질문-웹 #1 (0) | 2023.02.02 |
댓글