본문 바로가기
DB

[DB] 키, 인덱스 질문, 답변

by 오렌지마끼야또 2023. 5. 10.
728x90
반응형

 

 

 

 

 

키란?

  • 키는 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 튜플들을 서로 구분할 수 있는 “기준이 되는 속성(Attribute)”을 말한다.



사용 이유

  • 테이블에서 내가 원하는 데이터를 찾으려면 많은 시간이 필요한데 이러한 탐색 시간을 줄여줄 수 있는 것이 키다.

키종류

이름, 특징, 조건 설명 ( + null 값 가능 여부 )

Candidate Key (후보키)

  • 후보키는 릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
  • 하나의 릴레이션내에서는 중복된 튜플들이 있을 수 없으므로 모든 릴레이션에는 반드시 하나 이상의 후보키가 존재한다.
  • 후보키는 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.
  • 위 테이블에서 학생번호, 휴대폰 등이 후보키이다. 이름은 동명이인이 있으므로 유일성을 만족하지 않는다. 나이도 마찬가지로 같은 나이가 있으므로 유일성을 만족하지 않는다. 
  • NULL 값 불가능
  • 유일성 : 하나의 키 값으로 하나의 튜플만을 유일하게 식별할 수 있다.
  • 최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어 있어야 한다.

 

Primary Key (기본키)

  • 기본키는 후보키 중에서 선택한 주 키(Main Key)이다.
  • 한 릴레이션에서 특정 튜플을 유일하게 구별할 수 있는 속성이다.
  • NULL 값 불가능
  • 기본키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없다.
  • 위 테이블에서 기본키는 후보키 중에서 고르면 된다. 학생번호나 휴대폰 중 고르면 된다.

 

Alternate Key (대체키)

  • 후보키가 둘 이상일때 기본키를 제외한 나머지 후보키들을 말한다.
  • 보조키라고도 한다.
  • 만약 학생번호를 기본키로 골랐다면 휴대폰이 대체키가 된다.
  • NULL 값 불가능

 

Super Key (슈퍼키)

  • 슈퍼키는 한 릴레이션 내에 있는 속성들의 집합으로 구성된 키로서 릴레이션을 구성하는 모든 튜플들 중 슈퍼키로 구성된 속성의 집합과 동일한 값을 나타나지 않는다.
  • 슈퍼키는 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족시키지만, 최소성은 만족시키지 못한다.
  • 만약 (학생번호, 이름) 을 묶어서 키로 사용하면, 동명이인이 있어도 튜플을 구분할 수 있다. 예를 들어 2번 제니는 3번 제니와 다른 제니임을 알 수 있다. 따라서 유일성은 만족시키지만, 학생번호 하나만으로도 구분할 수 있다는 최소성을 만족시키지 못한다. 따라서 (학생번호, 이름), (학생번호, 나이), (휴대폰, 나이) 등등은 슈퍼키가 될 수 있다. 
  • 여러개의 속성으로 슈퍼키를 만들 때 반드시 1개 이상의 후보키가 포함되어야 한다.
  • NULL 값 가능

 

Foreign Key (외래키)

  • 관계를 맺고 있는 릴레이션 R1, R2 에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 외래키라고 한다.
  • 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조 관계를 표현하는데 중요한 도구이다.
  • NULL 값 가능



https://code-lab1.tistory.com/49#:~:text=%ED%82%A4%EB%8A%94%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C%20%EC%A1%B0%EA%B1%B4,%EC%86%8D%EC%84%B1(Attribute)%EB%A5%BC%20%EB%A7%90%ED%95%9C%EB%8B%A4.&text=%ED%85%8C%EC%9D%B4%EB%B8%94%20%EB%82%B4%EC%97%90%EC%84%9C%20%EC%96%B4%EB%96%A4%20%EB%8D%B0%EC%9D%B4%ED%84%B0,%ED%83%90%EC%83%89%20%EC%8B%9C%EA%B0%84%EC%9D%B4%20%ED%95%84%EC%9A%94%ED%95%A0%20%EA%B2%83%EC%9D%B4%EB%8B%A4.

 

 

 

 

—----------------------------------------------------------------------------------------------------------

 

 

 

Index에 대해 설명

  • 인덱스(index)는 데이터베이스에서 검색 속도를 향상시키기 위한 구조입니다. 데이터베이스 테이블의 컬럼(열)에 대한 키-값 쌍을 가지고 있으며, 데이터를 더 빠르게 검색할 수 있도록 하며, 데이터베이스의 성능을 향상시키는데 중요한 역할을 합니다.
  • 인덱스는 자주 사용되는 컬럼에 대해 생성됩니다. 해당 컬럼의 값을 정렬하여 저장하고, 검색 쿼리에서 해당 컬럼에 대한 조건을 포함할 때, 데이터베이스는 인덱스를 사용하여 빠르게 데이터를 검색합니다.
  • 그러나 인덱스를 생성하면 데이터 저장 및 갱신 작업에 추가적인 오버헤드가 발생하므로, 필요한 경우에만 인덱스를 생성해야 합니다.




장/단점

장점

  • DBMS 의 인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 탐색하는데는 빠르다.

단점

  • 새로운 값을 추가하거나 삭제, 수정하는 경우에는 쿼리문 실행 속도가 느려진다.




DBMS는 Index를 어떻게 관리하고 있나요? (Index 자료구조에 대해 설명해주세요)

B+Tree 인덱스 자료구조

  • 일반적으로 사용되는 인덱스 알고리즘. B+Tree 인덱스는 칼럼의 값을 변형하지 않고(사실 값의 앞부분만 잘라서 관리한다.), 원래의 값을 이용해 인덱싱하는 알고리즘이다.

해시 테이블

  • 칼럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원한다. 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 해시 인덱스를 사용할 수 없다. 주로 메모리 기반의 데이터베이스에서 많이 사용한다.




왜 index 를 생성하는데 b-tree 를 사용하는가?

  • 데이터에 접근하는 시간복잡도가 O(1)인 hash table 이 더 효율적일 것 같은데? SELECT 질의의 조건에는 부등호(<>) 연산도 포함이 된다. hash table 을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. 동등 연산(=)에 특화된 hashtable은 데이터베이스의 자료구조로 적합하지 않다.



 

Index 의 성능과 고려해야할 사항

  • 인덱스를 생성하면 검색 속도는 향상되지만, INSERT, DELETE, UPDATE 쿼리문을 실행할 때 추가적인 오버헤드가 발생한다. 그리고 컬럼을 이루는 데이터의 형식에 따라 인덱스의 성능이 악영향을 미칠 수 있다. 성별 같은 값의 range가 적은 경우 인덱스를 생성하면 비효율적일 수 있다. 따라서 모든 컬럼에 대해 인덱스를 생성하는 것은 효율적이지 않다. 필요한 경우에만 적절한 컬럼에 대해서만 인덱스를 생성해야 한다.

 

728x90
반응형

댓글