[DB] 인덱스

EHOI·2023년 2월 7일
0

DB

목록 보기
4/6

인덱스란?

  • 책의 색인을 보고 빠르게 해당 내용을 찾으러 갈 수 있는 것과 같은 장치이다.

왜 효율적일까?

  • 인덱스의 자료구조가 균형잡힌 B-Tree 기반으로 되어 있어서 O(logN)의 탐색 속도로 매우 빠르기 때문이다.
  • 또한 대수확장성 때문인데 트리가 한 depth 깊어질때, 인덱스 수는 빠르게 증가한다. 그래서 특정 노드까지 가는 depth가 짧다.

인덱스 최적화 기법

모두 비용! 이므로 인덱스 설정을 많이 하지 말자.

  • 인덱스도 비용이므로 쿼리에 있는 모든 필드를 인덱스로 설정하는 것은 좋지 못하다.
    • 책에 있는 단어 하나하나를 다 색인에 담아두면 찾기 힘든 것과 같다.
  • 인덱스는 두 번 탐색하도록 강요한다고 한다. 이도 비용이다.
  • 컬렉션이 수정된다면 인덱스도 수정되어야 한다. 이도 비용이다.
  • B-Tree의 높이를 균형있게 조절하는 것도 비용
  • 데이터를 분산시키는 것도 비용

항상 테스팅을 해보기

  • 미리 테스팅을 해보고 걸리는 시간을 최소화하자
  • explain() 함수를 사용하여 인덱스를 만들고 쿼리를 보내는 식으로 테스트하면 된다.
    EXPLAIN
    SELECT * FROM board
    JOIN post 
    ON board.id = post.board_id

복합 인덱스를 최적화하는 방법은 ‘같음 → 정렬 → 다중값 → 카디널리티’ 순이다.

  • 같음 쿼리의 where 절에서 id == 1 이라고 한다면 그 id 를 인덱스로 제일 먼저 설정한다.
  • 정렬 정렬에 쓰는 인덱스를 두번째로 설정한다.
  • 다중 값 여러 데이터를 출력하는 인덱스를 세번째로 설정
  • 카디널리티 더 유니크한 값을 먼저 인덱스로 설정한다. ex) 성별과 나이 : 나이가 더 유니크하다

clustered index vs non-clustered index

클러스터형 인덱스논클러스터형 인덱스 (보조 인덱스)
기본키 중 하나로 설정주로 복합키
테이블 당 한개 (보통 기본기가 클러스터형 인덱스가 됨)여러 개 만들 수 있음
인덱스 페이지의 리프노드에 데이터가 들어있음인덱스 페이지의 리프노드에 데이터 대신 그 페이지의 포인터가 들어있음
정렬이 되어 있어 탐색은 빠르고, 삽입,수정,삭제가 느림정렬이 되어 있지 않아서 탐색은 느리지만, 삽입, 수정, 삭제가 빠름
인덱스 순서와 데이터 순서가 일치함인덱스 순서와 데이터 순서가 뒤죽박죽

클러스터형 인덱스 생성시 (MySQL 기준)

alter table add primary key

논클러스터형인덱스 생성시 (MySQL 기준)

create indexalter table add index
profile
#성장 #단단함 #평온함

0개의 댓글