db index

TIL 카테고리의 글은 그날 배운 것을 정리하는 목적으로 포스팅합니다. 내용이 잘못되었다면 댓글로 피드백 부탁드립니다.

Index

지정한 컬럼들을 기준으로 메모리 영역에 목차를 생성하는 것

  • SELECT 의 성능을 향상되지만 INSERT,UPDATE,DELETE 성능은 떨어지게됨.
  • 디스크에서 읽는 것은 메모리에서 읽는 것보다 성능이 떨어짐.
  • 인덱스의 성능을 향상 시킨다는 것은 디스크 저장소에 얼마나 덜 접근하느냐, 인덱스 roof에서 leaf 까지 오고 가는 횟수를 얼마나 줄이느냐임.
  • 인덱스 개수는 3~4개가 적당함.

인덱스 칼럼 기준

1개의 컬럼만 인덱스를 걸어야 한다면?

카디널리티(cardinaliry)가 가장 높은 것을 잡아야함.

카디널리티란 해당 컬럼의 중복된 수치를 뜻함. 데이터가 중복될 가능성이 많은 성별, 학년 등은 카디널리티가 낮다고 하고 유니크한 데이터를 가지는 주민등록번호, 계좌번호 등은 카디널리티가 높다고 함.(pk 성질이 높은 것)

인덱스를 최대한 효율적으로 뽑을려면 해당 인덱스로 많은 부분을 걸러야하기 때문임. 성별이라면 남/녀 중 하나기때문에 인덱스를 통해 50% 밖에 걸러내지 못함.

여러 컬럼으로 인덱스 구성하려면?

카디널리티가 높은순 -> 낮은순으로 인덱스를 걸면 좋음.

여러 컬럼 인덱스 타기

조회 쿼리 사용시 인덱스를 태우려면 최소한 첫번째 인덱스 조건은 조회 조건에 포함되어있어야 함. 첫번째 인덱스 컬럼이 조회 쿼리에 없으면 인덱스를 타지 않기 때문.

주의사항

  • 범위 조건(>, BEETWEEN)은 해당 컬럼은 인덱스를 타지만 그 뒤 인덱스 칼럼들은 인덱스 사용이 안됨.
  • WHERE에서 or 사용은 주의해야함. (비교해야할 row가 늘어나기 때문)

  • 인덱스로 사용된 컬럼 값 그대로 사용해야 인덱스를 탐. (가공된 데이터를 저장하지 않음)
  • 조회 조건 순서는 중요하지 않음.