Database

[Database] 인덱스 인덱싱에 관하여

Ocean_ 2023. 8. 6. 15:52

들어가며

인덱싱이라는 개념을 들어보기만 했다 . . 이론으로만 알았다 . .

인덱스

데이터를 빠르게 찾을 수 있는 하나의 장치이다.

도서의 색인이나 사전과 같이 데이터를 쉽고 빠르게 찾을수있도록 만든 데이터 구조.

인덱스는 흔히 B-TREE 라는 자료 구조로 이루어져 있다.

인덱스가 효율적인 이유

균형 잡힌 트리구조, 선형적으로 증가하는 대수확장성 때문이다.

인덱스를 만드는 방법

클러스터형 인덱스

  • 테이블 당 하나 설정할 수 있다.
  • primary key 옵션으로 기본키를 만들면 생성가능하다.
  • unique not null 옵션으로 클러스터형 인덱스를 만들 수 있다.

세컨더리 인덱스

  • 빈번하게 처리되는 질의문에서 WHERE 절 이후 조건을 인덱스화

클러스터 인덱스

  • 기본키에 대하여 클러스터 인덱스를 생성한다
  • 기본키 지정없으면 UNIQUE 속성에 대해 클러스터 인덱스 생성
  • 기본키,UNIQUE 없으면 자체 생성 행번호로 클러스터 인덱스 생성

보조 인덱스

  • 클러스터 인덱스가 아닌 모든 인덱스는 보조 인덱스
  • 보조인덱스 각 레코드는 속성과 키본키 속성값을 갖고 있다.
  • 보조인덱스 검색해서 기본키 속성 찾은 후 클러스터 인덱스로 가 해당 레코드를 찾는다.
  • 특정키 값 찾는 검색은 성능 보장하지만, 범위검색은 보장 못함

보조 옵션으로 기본키 생성

현재 100개의 member 중 image로 find 해보았는데

image에 대한 인덱스를 걸었더니 조금 향상된 모습을 보인다.

인덱스는 무조건 좋은가 ?

인덱스 자체 역시 하나의 데이터 덩어리 이기 때문에, 데이터베이스에 전체 크기의 10%나 되는 추가적인 공간을 할당해줘야 하고, 잘못 사용할 경우 성능이 오히려 크게 떨어질 수 있다는 단점이 있다. (ex. 변경 작업이 자주 일어나는 경우, 인덱스가 적절하지 않은 경우)

클러스터 인덱스와 보조 인덱스 차이

위의 예시에서는 unique한 값이 id 외에 존재하지 않아 보조 인덱스로 설정하였다.

  • 클러스터형 보다 검색 속도는 더 느리지만 데이터의 입력/수정/삭제는 덜 느리다.
  • 보조 인덱스는 여러 개 생성할 수 있다. 그러나 함부로 사용할 경우에는 오히려 성능을 떨어뜨릴 수 있다.

인덱스 최적화 기법

인덱스는 두번 탐색한다. 인덱스 리스트, 컬렉션 순으로.

그래서 읽기 비용이 든다.

컬렉션이 수정되었을 때 인덱스도 수정해야한다. B트리 높이를 균형있게 조절하며, 데이터를 효율적으로 조회할 수 있도록 분산하는 비용도 든다.

여러 필드를 기반으로 조회 시 복합 인덱스를 생성하는데, 이는 순서가 있고 이에 따라 성능이 달라진다.

  1. 같음 을 비교 하는 값
  2. 정렬에 쓰는 필드
  3. 다중 값을 출력해야 하는 필드
  4. 유니크한 값의 정도가 높은 필드