업데이트:

카테고리:

/

태그: ,

인덱스

데이터를 빠르게 찾을 수 있는 장치 ex) 책의 마지막에 있는 찾아보기 페이지

B-트리

인덱스의 구현 형태 - 루트 노드 → 브랜치 노드 → 리프 노드

스크린샷 2023-06-22 오후 2.32.46.png

E 를 찾는다고 하였을때 무작정 찾는 것이 아닌, E가 있을거같은 리프 노드에 들어가서 탐색을 시작한다.

실제로 트리 탐색이 일어나면 가장 상위의 루트 노드부터 탐색이 시작되어 브랜치 노드, 리프 노드 순으로 탐색이 된다.

57을 찾는다고 하면, 57보다 크거나 같을 때 까지 탐색을 시작하고, 같으면 탐색을 끝낸다.

인덱스가 효율적인 이유는 균형잡힌 트리 구조와, 깊이의 대수확장성

대수확장성 : 트리의 깊이가 노드의 수 보다 느리게 성장한다.

트리깊이 인덱스 수
3 64
4 256
5 1024
6 4096
7 16384
8 66536

제작 방법

  1. 클러스터형 인덱스
    • 테이블 당 하나만 생성 가능 = 기본키
    • 인덱스 순서대로 데이터가 저장 → 범위 데이터 / 정렬된 순서의 데이터를 가져오는데 유리
    • 재구성 (INSERT, UPDATE, DELETE) 이 자주 일어나는 데이터는 성능이 안 좋아질 수 있음
  2. 비클러스터형 인덱스
    • 테이블 당 여러개 생성 가능
    • 인덱스 : 키 값 + 레코드 위치 정보
      • 범위 검색이 필요한 경우 데이터에 빠르게 접근할 수 있어 성능이 매우 좋다.
    • 재구성에는 크게 영향을 받지 않음

최적화 기법

  1. 인덱스 = 비용

    인덱스 * 2 = 인덱스 리스트 → 컬렉션 순으로 탐색

    컬렉션이 수정되면, 인덱스도 수정되게 된다.

    필드를 무작정 다 인덱스를 설정하는 것은 비용 낭비, 컬렉션에서 가져와야 되는 데이터가 많아질 수록 인덱스를 사용하는 것은 비효율적

  2. 테스트

    서비스에 따라서 객체의 깊이, 테이블의 양이 다르게 때문에 테스트 explain() 함수를 통해 걸리는 시간을 최소화

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

    인덱스로 지정하면 데이터를 검색할 때 테이블까지 들어가지 않아도 검색을 진행하기 때문에 접근 속도가 빠르다. 값을 확인하려면 테이블에 접근해야함

    카디널리티 : 중복도가 낮으면 → 카디널리티 높음 / 중복도가 높음 → 카디널리티 낮음

    ⇒ (상대적인) 전체 행에 대한 특정 컬럼의 중복정도

    복합인덱스를 설정할 때 생성 순서대로 성능에 차이가 존재한다.

    1. 어떠한 값과 같음을 비교하는 == 이나 equal 이라는 쿼리가 있다면 제일 먼저 인덱스로 설정
    2. 정렬을 쓰는 필드를 그다음으로 설정
    3. 다중 값을 출력해야 되는 필드, <, > 와 같이 많은 값을 출력해야 되는 쿼리면 나중에 인덱스를 설정
    4. 카디널리티가 높은 값부터 인덱스를 생성해야됨

      나이 < 이메일 : 이메일부터 인덱스를 생성