[데이터베이스] 키, 반정규화, 인덱스

공혁준·2022년 4월 25일
0

데이터베이스

목록 보기
3/4
post-thumbnail

📌 키, 반정규화, 인덱스를 다룹니다.

Key

검색, 정렬시 Tuple을 구분할 수 있는 기준이 되는 Attribute

Candidate Key (후보키)

Tuple을 유일하게 식별하기 위해 사용하는 속성들의 부분 집합. (기본키로 사용할 수 있는 속성들)

2가지 조건 만족

  • 유일성 : Key로 하나의 Tuple을 유일하게 식별할 수 있음
  • 최소성 : 꼭 필요한 속성으로만 구성

Primary Key (기본키)

후보키 중 선택한 Main Key

특징

  • Null 값을 가질 수 없음
  • 동일한 값이 중복될 수 없음

Alternate Key (대체키)

후보키 중 기본키를 제외한 나머지 키 = 보조키

Super Key (슈퍼키)

유일성은 만족하지만, 최소성은 만족하지 못하는 키

Foreign Key (외래키)

다른 릴레이션의 기본키를 그대로 참조하는 속성의 집합

반정규화

반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로 의도적으로 정규화 원칙을 위배하는 행위이다.

  • 반정규화를 수행하면 시스템의 성능이 향상되고 관리 효율성은 증가하지만, 데이터의 일관성과 정합성은 저하될 수 있다.
  • 과도한 반정규화는 성능을 저하시킨다.
  • 반정규화를 위해서는 사전에 데이터의 일관성과 무결성을 우선으로 할지, 데이터베이스의 성능과 단순화를 우선으로 할지 생각한다.
  • 반정규화 방법에는 테이블 통합, 테이블 분할, 중복 테이블 추가, 중복 속성 추가 등이 있다.

테이블 통합

두 개의 테이블이 조인되는 경우가 많아 하나의 테이블로 합쳐 사용하는 것이 성능 향상에 도움이 될 경우 수행한다. 두 개의 테이블에서 발생하는 프로세스가 동일하게 자주 처리되는 경우, 두 개의 테이블을 이용하여 항상 조회를 수행하는 경우 테이블 통합을 고려한다.

테이블 통합 시 고려사항

  • 검색은 간편하지만, 레코드 증가로 인해 처리량이 증가한다.
  • 테이블 통합으로 인해 입력, 수정, 삭제 규칙이 복잡해질 수 있다.

테이블 분할

테이블을 수직 또는 수평으로 분할하는 것이다.

  1. 수평 분할: 레코드를 기준으로 테이블을 분할한다.
  2. 수직 분할: 하나의 테이블에 속성이 너무 많을 경우 속성을 기준으로 테이블을 분할한다.
    • 갱신위주의 속성 분할 : 데이터 갱신 시 레코드 잠금으로 인해 다른 작업을 수행 할 수 없으므로 갱신이 자주 일어나는 속성들을 수직 분할하여 사용한다.
    • 자주 조회되는 속성 분할 : 테이블에서 자주 조회되는 속성이 극히 일부일 경우 자주 사용되는 속성들을 수직분할하여 사용한다.
    • 크기가 큰 속성 분할 : 이미지, 2GB 이상 저장될 수 있는 텍스트 형식으로 된 속성들을 수직분할하여 사용한다.
    • 보안을 적용해야 하는 속성 분할 : 테이블 내의 특정 속성에 대해 보안을 적용할 수 없으므로 보안을 적용해야 하는 속성들을 수직분할 하여 사용한다.

테이블 분할 시 고려사항

  • 기본키의 유일성 관리가 어려워진다.
  • 데이터 양이 적거나 사용 빈도가 낮은 경우 테이블 분할이 필요한 지를 고려해야한다.
  • 분할된 테이블로 인해 수행 속도가 느려질 수 있다.
  • 검색에 중점을 두어 테이블 분할 여부를 결정해야 한다.

중복 테이블 추가

여러 테이블에서 데이터를 추출해서 사용해야 하거나 다른 서버에 저장된 테이블을 이용해야 하는 경우 중복 테이블을 추가하여 작업의 효율성을 향상시킬 수 있다.

  1. 중복 테이블을 추가하는 경우
    • 정규화로 인해 수행 속도가 느려지는 경우
    • 많은 범위의 데이터를 자주 처리해야하는 경우
    • 특정 범위의 데이터만 자주 처리해야 하는 경우
    • 처리 범위를 줄이지 않고는 수행 속도를 개선할 수 없는 경우
  2. 중복 테이블을 추가하는 방법
    • 집계 테이블의 추가 : 집계 데이터를 위한 테이블을 생성하고, 각 원본 테이블에 트리거를 설정하여 사용하는 것으로, 트리거의 오버헤드에 유의한다.
    • 진행 테이블의 추가 : 이력 관리 등의 목적으로 추가하는 테이블로, 적절한 데이터 양의 유지와 활용도를 높이기 위해 기본키를 적절히 설정한다.
    • 특정 부분만을 포함하는 테이블의 추가 : 데이터가 많은 테이블의 특정 부분만을 사용하는 경우 해당 부분만으로 새로운 테이블을 생성한다.

중복 속성 추가

조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가하는 것이다.

중복 속성을 추가하면 데이터의 무결성 확보가 어렵고, 디스크 공간이 추가로 필요하다.

  1. 중복 속성을 추가하는 경우

    • 조인이 자주 발생하는 속성인 경우
    • 접근 경로가 복잡한 속성인 경우
    • 액세스 조건으로 자주 사용되는 속성인 경우
    • 기본키의 형태가 적절하지 않거나 여러 개의 속성으로 구성된 경우
  2. 중복 속성 추가 시 고려 사항

    • 테이블 중복과 속성의 중복을 고려한다.
    • 데이터 일관성 및 무결성에 유의해야 한다.
    • 저장공간의 지나친 낭비를 고려한다.

Index (인덱스)

RDBMS에서 검색속도를 높이기 위해 사용하는 하나의 기술이다.

index는 색인이다. 해당 테이블의 컬럼을 색인화(따로 파일로 저장)하여 검색 시 해당 테이블의 레코드를 full scan 하는게 아니라 색인화 되어있는 index 파일을 검색하여 검색속도를 빠르게 한다.

이런 index는 tree 구조로 색인화한다. RDBMS에서 사용하는 index는 balance search tree를 사용한다. 실제로는 RDBMS에서 사용되는 B-Tree는 B-Tree에서 파생된 B+ Tree를 사용한다고 한다.

Index의 원리

index를 해당 컬럼에 주게 되면 초기 테이블 생성시 만들어진 MYD, MYI, FRM 3개의 파일 중에서 MYI에 해당 컬럼을 색인화하여 저장한다. 물론 index를 사용 안할시에는 MYI 파일은 비어있다. 그래서 index를 해당 컬럼에 만들게 되면 해당 컬럼을 따로 인덱싱하여 MYI 파일에 입력한다.

사용자가 SELECT 쿼리로 index가 사용하는 쿼리를 사용 시 해당 테이블을 검색하는 것이 아니라 tree로 정리해둔 MYI 파일의 내용을 검색한다. 만약 index를 사용하지 않은 SELECT 쿼리라면 해당 테이블을 full scan하여 모두 검색한다.

Index의 장점

  • 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킨다.
  • 질의나 보고서에서 그룹화 작업의 속도를 향상시킨다.
  • 인덱스를 사용하면 테이블 행의 고유성을 강화시킬 수 있다.

Index의 단점

  • 인덱스를 만들면 .mdb 파일 크기가 늘어난다.
  • 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
  • 인덱스 된 필드에서 데이터를 업데이트하거나, 레코드를 추가 또는 삭제할 때 성능이 떨어집니다.
  • 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해진다. (DB의 10퍼센트 내외의 공간이 추가로 필요)
  • 인덱스를 생성하는데 시간이 많이 소요될 수 있다.
  • 데이터 변경 작업이 자주 일어날 경우에 인덱스를 재작성해야 할 필요가 있기에 성능에 영향을 끼칠 수 있다.

참고

https://github.com/gyoogle/tech-interview-for-developer
https://github.com/Seogeurim/CS-study
https://lalwr.blogspot.com/2016/02/db-index.html

profile
몰입을 즐기는 개발자입니다.

2개의 댓글

comment-user-thumbnail
2022년 4월 28일

우아한형제들 개발블로그에 mysql이랑 postgreSql에 대해 비교한 글이 있습니다. 전 읽어봐도 무슨말인지 잘 모르겠지만 관심있으시면 읽어보세요~~
https://techblog.woowahan.com/6550/

1개의 답글