[CS] 이상, 인덱스

[1] 이상(Anomaly) : 데이터베이스에서 정규화를 수행하지 않으면, 데이터의 중복이 발생하면서 무결성이 저하됨.

→ 테이블을 설계할 때 정규화가 올바르게 수행되지 않아 데이터를 삽입, 삭제, 수정할 때 논리적으로 생기는 오류를 말함

  • 삽입 이상(Insertion anomaly)
  • : 특정 데이터가 존재하지 않아 중요한 데이터를 데이터베이스에 삽입할 수 없을 때 발생
  • 삭제 이상(Deletion anomaly)
  • : 특정 정보를 삭제하면, 원치 않는 정보도 삭제되는 현상
  • 업데이트 이상(Update anomaly)
  • : 테이블의 특정 데이터를 업데이트 했는데, 정상적으로 변경되지 않은 경우, 그리고 너무 많은 행을 업데이트 하는 것

[2] 인덱스(Index)

: 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조

: 테이블의 특정 컬럼에 인덱스를 생성하면, 해당 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장됨

: 컬럼의 값과 물리적 주소를 (key, value)의 한 쌍으로 저장함

  • 인덱스의 장단점
    1. 장점
    • 데이터가 정렬되어 있기 때문에 테이블에서 검색과 정렬 속도를 향상 시킴
      • 조건 검색 WHERE 절의 효율성 : 보통 where절을 사용할 때 특정 조건에 맞는 데이터를 찾기 위해 데이터를 처음부터 끝까지 다 비교해야 하는데, 인덱스를 통해 데이터가 정렬되어 있으면 빠르게 찾아낼 수 있음
      • 정렬 ORDER BY 정의 효율성 : 인덱스를 사용하면 order by를 통한 sort과정을 피할 수 있음
      • MIN, MAX의 효율적인 처리가 가능
    • 테이블 행의 고유성을 강화시킬 수 있음
    • 시스템의 전반적인 부하를 줄일 수 있음
    1. 단점
    • 정렬된 상태를 계속 유지시켜야 한다는 것
      • 인덱스가 적용된 컬럼에 정렬을 변경시키는 INSERT, UPDATE, DELETE 명령어가 수행되면, 그 후에 재정렬을 해주어서 그에 따른 부하가 발생함
    • 인덱스 스캔이 무조건 좋은 것은 아님
    • 속도 향상을 위해 인덱스를 많이 만드는 것은 좋지 않음
      • 인덱스를 관리하기 위해서는 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요
      • 때문에 인덱스를 많이 생성하면 하나의 쿼리문을 빠르게 만들수 있는 한편, 전체적인 데이터베이스의 성능 부하를 추래함
  • 인덱스를 사용하면 좋은 경우
    • 규모가 큰 테이블
    • 삽입, 수정, 삭제 작업이 자주 발생하지 않는 컬럼
    • WHERE이나 ORDER BY, JOIN 등이 자주 사용되는 컬럼
    • 데이터의 중복도가 낮은 컬럼
  • : 인덱스를 효율적으로 사용하기 위해선 데이터의 range가 넓고 중복이 적을수록, 조회가 많거나 정렬된 상태가 유용한 컬럼에 사용하는 것이 좋음
  • 인덱스의 자료구조
  1. 해시 테이블(Hash Table) : key와 value를 한 쌍으로 데이터를 저장하는 자료구조
  2. B+Tree : 기존 B-Tree의 단점을 개선시킨 자료구조로, 균형 잡힌 이진 검색 트리
    • 내부 노드(Internal node)와 단말 노드(Leaf node)로 구분
    • 데이터는 단말노드에서만 저장, 내부 노드에는 검색을 위한 인덱스만 저장
    • 모든 리프 노드가 연결리스트로 연결되어 있으며, 순차적으로 저장되어 있음
    • → 범위 검색(Range Search)나 순차 검색(Sequential Search)에 효율적

'CS > Database' 카테고리의 다른 글

[CS] Redis  (1) 2023.11.01
[CS] 트랜잭션의 격리 수준 (Transaction Isolation Level)  (1) 2023.11.01
[CS] 트랜잭션 (Transaction)  (0) 2023.11.01
[CS] 정규화  (1) 2023.11.01
[CS] Key, Join, NoSQL  (2) 2023.10.23