Index 인덱스 란?

강준호·2024년 1월 19일
0

기술면접

목록 보기
5/9

Index 란?

  • 데이터베이스 테이블에 대한 검색 성능의 속도를 높여주는 자료 구조
  • 교과서의 목차같은것.
  • 빠르게 정보를 찾기 위함!

인덱스는 왜 사용할까?

  • 인덱스는 데이터를 찾는 프로세스 속도를 높이는 데 사용

  • 모든 레코드를 조사하는건 너무 느리거든.

  • 실제 DB 관련 작업을 할 때 Select문, 특히 조건 검색 Where절에서 속도 저하가 크게 발생하는데
    이때, Index를 사용하면 큰 효과를 볼 수 있다.

  • 데이터들이 정렬되어 있기때문에 큰 장점! (물론 어떤 인덱스를 사용하냐에 따라 다르긴 하다)

언제 좋아?

  • 조건 검색 Where 절의 효율성
  • 정렬 Order by 절의 효율성
  • MIN, MAX의 효율적인 처리가 가능하다.

이미 정렬되어 있어서 조건에 맞는거 찾기 쉽거든.

그럼 항상 좋을까? 🤔

단점1. 정렬된 상태를 계속 유지 시켜줘야 한다

  • 레코드 내에 데이터값이 바뀌는 부분이라면 악영향!

  • Ex) INSERT, UPDATE, DELETE를 통해 데이터가 추가, 변경 된다면 INDEX 테이블 다시 정렬해야한다ㅜ

  • 트랜잭션이 많은 환경이나 자주 변경되는 데이터베이스에서는 인덱스 이점 << 오버헤드일수도 있어.

단점2. 인덱스가 항상 성능이 좋은 것이 아니다

  • 매우 일반적인 값 검색 or 많은 양의 데이터를 반환할때는 일반 검색이 훨씬 좋다.
SELECT * FROM Books WHERE Genre = 'Fiction';
  • 만약 여기서 대부분 Books 가 Fiction 에 해당한다면, 성능도 미미. + 인덱스를 거쳤다 데이터를 가져오는 2단계 프로세스로 인한 성능저하..

단점3. 추가 저장 공간 필요

  • 데이터베이스의 약 10%에 해당하는 저장공간이 추가로 필요하다.
  • 책 목차가 페이지를 차지하는 것처럼 데이터와 별도의 구조이기 때문에..

Hash 인덱스 VS B-Tree 인덱스

Hash 인덱스

  • 여러 개 있는 상자에 상품의 특수 번호(해싱)에 따라 이러한 칸에 물건을 넣는다.

  • 각 키(인덱싱되는 값)는 해시 함수를 사용하여 해시 테이블의 위치를 나타내는 해시 코드로 변환됩니다.

  • 정렬되어 있다고 볼 수 없다. But, 정렬할 필요가 없으니 삽입/삭제가 빠를 수 있다.

  • 다만 해싱된 데이터 값에 따라 저장될 버킷 위치를 정하기 때문에 빠른 속도로 검색 영역을 제한할 수 있다.

특징

동등 검색(==)의 효율성

  • 정확한 일치 조건(예: 'WHERE 열 = 값')이 포함된 쿼리에 매우 효율적!

무작위 검색

  • 해시 테이블 전체에 데이터를 무작위로 분산시키기 때문에 범위 검색(예: 특정 숫자보다 큰 모든 값 찾기)에는 적합하지 않.

고유한 해시 값

  • 이상적으로는 해시 함수가 전부 고유한 해시 값을 생성해야 하지만, 만에하나 중복이 발생할 가능성이 있습니다.

B-Tree(Balanced Tree) 인덱스

  • B-Tree 인덱스는 항상 정렬된 상태를 유지한다.

  • 정렬된 상태를 항상 유지해야하기 때문에 삽입과 삭제시에 오버헤드 발생

  • 이 경우는 정렬된 상태로 검색 범위를 제한시킬 수 있는게 맞다.

특징

범위 검색의 효율성

  • 범위 검색 및 순서 검색에 매우 적합

대소비교 작업에 적합

  • 대소비교 및 조건 쿼리에 적합

균형 잡힌 성격

  • 모든 리프 노드가 루트에서 같은거리에 있도록 하여 검색 성능이 예측 가능하다!

다재다능

  • 대부분의 경우 더 좋은 성능이다.

대부분 B-tree가 유리한데 그럼 Hash 인덱스는 왜 쓸까?

  • 동등 검색으로 주로 구성된 키-값 저장소와 같은 시나리오 에서 효율적!

  • 캐싱 시나리오 및 특정 유형의 NoSQL 에서 선호됨.


B-Tree 인덱스와 B+-Tree 인덱스의 차이는 무엇인가요?

B+트리 인덱스

  • 기존 노드에 key 와 데이터를 담는 B-트리의 변형.

  • 오직 리프 노드에만 key 와 data 를 저장하고, 나머지는 key 만 담는데, 이를 Linked list 로 연결

  • 대용량 데이터를 효율적으로 관리할 수 있는 기능으로 인해 데이터베이스 시스템, 특히 인덱싱에 사용됩니다.

특징

메모리 확보

  • 키(실제 데이터 레코드가 아님)만 포함하므로 더 많은 키를 저장할 수 있고 트리 높이가 줄어든다!

  • 리프노드에 모든 데이터가 다 있어서 선형탐색으로 조회 가능! => B-tree 보다 빠르다.


인덱스 Scan 방식은 무엇이 있나요?

좋은 인덱스를 설계하기 위해 고려해야 하는 조건으로는 무엇이 있는지 아시나요?

인덱스 설계시 NULL값은 고려되야 할까요? 고려해야 한다면 어떤 이유인가요?

클러스터 인덱스와 논클러스터 인덱스는 어떤 차이가 있나요?

인덱스(Index Server) 샤딩 방식에 대해서 아시나요?

0개의 댓글