DB Index

2020. 6. 19. 19:10DB

728x90

DB Index란

 DB Index는 데이터베이스 분야에 있어서 테이블에 대한 동작 속도를 높여주는 자료 구조를 말합니다. 인덱스는 테이블 내 1개 이상의 컬럼을 이용하여 생성할 수 있습니다. 인덱스는 주로 특정 값을 가지고 있는 컬럼 혹은 값을 빠르게 찾기 위해서 사용됩니다. 인덱스가 이용되지 않은 데이터베이스는 데이터를 검색할 때 전체 테이블에 걸쳐서 검색하기 때문에 테이블이 크면 클 수록 비용이 엄청나게 늘어납니다. 만약 테이블이 특정 컬럼에 대한 인덱스를 가지고 있다면, 모든 데이터를 조사하지 않고도 데이터 파일의 중간에서 검색 위치를 빠르게 잡아낼 수 있습니다. 이러한 Index는 Tree 구조로 이루어져 있습니다. 일반적으로 RDBMS에서 사용하는 Index는 B+ Tree라는 구조를 사용하고 있습니다.

Index 자료구조

B+Tree 인덱스
 일반적으로 사용되는 인덱스 알고리즘은 B+Tree 알고리즘입니다. B+Tree 인덱스는 칼럼의 값을 변형하지 않고, 원래의 값을 이용해 인덱싱 하는 알고리즘입니다.
Hash 인덱스
 컬럼의 값으로 해시 값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원합니다. 하지만 값을 변형해서 인덱싱하므로, 특정 문자로 시작하는 값으로 검색을 하는 등 전방 일치와 같이 값의 일부만으로 검색하고자 할 때는 Hash 인덱스를 사용할 수 없습니다.

Index의 특징

  • 인덱스는 열 단위로 생성됨
  • 데이터의 중복도가 높은 컬럼은 인덱스로 만들어도 효용이 없음

Index의 장점

  • 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킴
  • 질의나 보고서에서 그룹화 작업의 속도를 향상
  • 인덱스를 사용하면 테이블 행의 고유성을 강화시킬 수 있음
  • 여러 필드로 이루어진 인덱스를 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있음

Index의 단점

  • 인덱스된 필드에서 데이터를 업데이트하거나, 레코드를 추가 또는 삭제할 때 성능이 저하됨
  • 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요
  • 인덱스를 생성하는데 많은 시간이 소요될 수 있음
  • 데이터 변경 작업이 자주 일어날 경우에는 인덱스를 재작성해야 할 필요가 있기 때문에 성능에 영향을 줄 수 있음

Index의 주의 사항

  • DML에 취약함
    • Insert: 인덱스는 데이터가 순서대로 정렬되어야 하는데, 기존 블록에 여유 공간이 없는 상황에서 그 블록에 새로운 데이터가 입력되어야 할 경우 인덱스의 Block들이 나누어지는 현상이 발생할 수 있음
    • Delete: 인덱스에서 데이터가 delete될 경우에는 데이터가 지워지지 않고, 사용 안 됨 표시만 생성. 즉 실제 테이블 데이터의 개수와 인덱스 데이터의 개수가 일치하지 않을 수 있음
    • Update: 인덱스는 update라는 개념이 없기 때문에 테이블에 update가 발생할 경우, 인덱스에서는 delete와 insert 두 개의 작업이 인덱스에 동시에 일어나 더 큰 부하를 줌
  • 다른 SQL 실행에 악영향: 갑자기 인덱스가 추가될 경우 잘 돌아가고 있던 쿼리에 옵티마이저가 실행계획을 바꾸는 경우가 생겨 갑자기 느려질 수 있음

Index 생성시, 고려할 점

 Index를 생성할 때에는 where 절과 join, order by등과 관련된 컬럼 중 사용 빈도가 높고 키 값의 선별도가 좋은 컬럼에 사용해야 합니다. 반대로 빈도가 낮고 선별도가 낮은 컬럼에는 인덱스를 사용하지 않는 것이 좋습니다. 또 테이블이 작거나 자주 갱신 될 때도 사용하지 않는 것이 좋습니다. 선택한 키의 검색 일치율이 10% 미만일 경우에는 Index를 사용하는 것이 좋지만, 그 이상일 경우는 Full Scan이 더 나을 수 있습니다.

728x90

'DB' 카테고리의 다른 글

SQL IN과 OR의 비교  (0) 2020.09.11
MVCC  (0) 2020.06.26
Trigger  (0) 2020.06.18
Sharding  (0) 2020.05.08
Scala Subquery vs Left Outer Join  (0) 2020.03.30