CS전공지식 노트/5. DB

데이터베이스 #4 : 인덱스

berryberries 2023. 7. 31. 23:17

1. 인덱스

추가적인 쓰기 작업과 저장곤간으 활용하여 DB테이블의 검색 속도를 향상시키기 위한 자료구조
-> DB테이블의 모든 데이터를 검색할 때 좀더 효과적이고 빠르게 할 수 있게 해준다.

1) 인덱스 종류

Clustered Index

clustered index는 테이블에 저장되는 데이터 순서대로 순서가 정의 되는데 한가지 방법으로만 정렬이 된다.

이말은 컬럼 하나를 기준으로 정렬된다는 뜻인데 보통 PK키를 clustered index로 지정한다. 데이터가 저장될 때 데이터 페이지가 만들어지 면서 PK키 기준으로 정렬된다. 리프 노드에 인덱스 페이지가 들어가기 때문에 데이터 탐색하는데 효율적이다. 하지만 데이터가 많을 경우엔 성능이 저하 된다.

 

 데이터를 삽입 한다고 했을 때, 데이터가  중간에 삽입이 된다면 한 칸씩 이동을 해줘야 한다. 데이터가 많은 테이블인 경우에는 많은 수의 행들이 수정 되어야 하기때문에 성능 저하로도 이어진다.

따라서, insert같이 수정이 빈번한 컬럼을 clustered index로 지정하게 되면 DB성능이 떨어지게 된다.

 

Non - Clustered Index

Non - clustered index는 데이터가 테이블에 저장되는 것이 아니라 별도의 다른 공간에 저장된다. 그리고 테이블에 여러개의 인덱스를 생성 할 수 있다. clustered index와 달리 리프노드에 실제 데이터가 저장되는 것이 아니라 데이터 페이지에 대한 포인터가 저장된다. 이 포인터가 실제 데이터가 저장된 주소에 접근하게 된다. 정렬되어 있지 않기 때문에 clustered inedex 보다 속도가 느리며 인덱스의 순서와 데이터의 순서가 일치하지 않는다

 

Clustered Index Non - clustered index
테이블당 1개의 인덱스 테이블에 여러개 인덱스 가능
테이블에 실제 데이터가 정렬되어 있다.  별도의 공간에 데이터가 저장되고 정렬되어있지 않다.
검색속도 빠름 검색속도 느림 
삽입,삭제,수정 느림 삽잆,삭제,수정 빠름

 

2. 인덱스의 장단점

1) 장점

1. 테이블 조회 속도와 그에 따른 성능 향상가능

  •  레코드가 입력될 때 순서없이 저장되기 때문에 WHERE절로 조건 검색을 할 때도 풀스캔을 해서 데이터를 조회하게 된다. 하지만 인덱스는 정렬이 기본적으로 되어있기 때문에 WHERE절로 빠르게 조건 검색을 할 수 있다.

2. 전반적인 시스템 부하를 줄일 수 있다.

  •  ORDER BY의 sort과정을 피할수 있다. 메모리에서 1차적으로 정렬을 해준 후 필요하다면 디스크 I/O도 추가적으로 발생되기 때문에 ORDER BY는 기본적으로 부하가 많이 걸리는 작업이다. 하지만 인덱스는 이미 정렬이 되어 있는 상태기 때문에 자원의 소모를 줄일 수 있다.

2) 단점

1. 인덱스 관리를 위해 DB의 약 10%에 해당하는 추가 저장공간이 필요하다.

  • 테이블 전체 데이터 중 10~15%를 처리해야할 경우에 효율적이다. 그 이상의 데이터를 처리하려고 할 때는 오히려 성능이 떨어지게된다. 

2. 인덱스를 잘못 사용 했을 경우, 성능저하가 발생할 수 있다.

  • DML에 약하다. 인덱스는 정렬된 상태를 유지해야 하기때문에  INSERT, DELETE, UPDATE와 같이 빈번하게 사용되는 경우 DB안의 데이터들이 계속 정렬을 하게 된다. 데이터들이 수정되고 추가되면 테이블 뿐만 아니라 인덱스 테이블도 수정이 되어야 하기 때문에 성능이 감소된다.

3. 관리하기 위한 추가 작업이 필요하다.

  • 부하를 줄이기 위해서 인덱스는 데이터를 사용하지 않음 처리를 해준다.

 

 * 데이터 베이스에서 인덱스를 왜 사용할까 ?

인덱스는 DB에서 검색을 좀더 빠르고 효율적으로 수행하기 위해서 사용한다. 인덱스는 기본적으로 정렬이 되어 있기 때문에  WHERE절을 사용한 조건 검색을 효율적으로 수행 가능하다. 하지만 INSER나 UPDATE와 같이 빈번하게 사용되는 컬럼에 인덱스를 사용하게 되면 부하가 걸리게되고 이로인한 성능 저하가 생기기 때문에 규모가 크지 않은 테이블에서 인덱스를 사용하는 것이 좋다.

 

3. 인덱스 자료구조

인덱스가 효율적인 이유는 B-tree기반의 균형잡힌 트리구조트리 깊이의 대수확장성 때문이다.

* 트리 깊이 : 루트 노드로부터 특정 노드까지 최단 거리로 갔을 때의 거리

대수확장성 : 트리 깊이가 리프노드 수에 비해 매우 느리게 성장하는 것

 

1)  B-tree 

 

B-트리

  • 이진트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리구조를 가진 균형잡힌 트리
  • 최상단에 1개의 노트를 루트노드라 하고 중간 노드인 브랜치 노드,  최하단의 리프노드로 구성되어 있다.
  • 균형잡힌 B-tree기반으로 구축되어 있기 때문에 탐색에 시간복잡도 0(logN) 걸림
  • 대수확장성 때문에 트리 생성시 더 빠르게 데이터를 찾을 수 있다.
HashTable
1. key-value쌍으로 데이터를 저장하는 자료구조
2. 시간 복잡도가 0으로 매우 빠르지만 일반적인 DB 자료구조로는 잘 쓰이지 않고 메모리 기반 DB에 사용됨
3. 해시는 등호(=)연산에 특화됨. 부등호(>,<)연산을 자주쓰는 데이터베이스를 사용 할 땐 해시테이블이 부적절.
4. 때문에 부등호 연산을 사용하는 b-tree가 일반적으로 사용된다.

 

4. 인덱스 최적화 기법 

1) 인덱스는 비용이다.

  • 인덱스는 인덱스 리스트, 컬렉션 순으로 탐색한다
  • 두번 탐색을 하기 때문에 관련 읽기 비용이 든다.
  • 컬랙션이 수정되면 인덱스도 수정되기 때문에 수정 비용도 든다.
  • 때문에 무작정 필드에 인덱스를 설정하면 안된다.

2) 항상 테스팅하기.

  • 테스팅을 통해 걸리는 시간을 최소화 해야한다.

3) 복합 인덱스는 같음, 정렬, 다중값 , 카디널리티 순이다.

  • 여러 필드 조회시 복합 인덱스를 생성한다.

 

 

참고자료