Spring, CS 공부 내용 5

김정용·2025년 1월 22일

기술면접 공부

목록 보기
5/15
post-thumbnail

데이터베이스 인덱스?

백엔드 공부를 하면서 DB의 인덱스를 모르는 사람은 없을거라고 생각한다.

인덱스?

검색속도 향상을 목적으로 책의 색인 부분과 같다.

저장되는 컬럼 값을 사용해 항상 정렬된 상태를 유지한다.

장점 👍

검색성능 향상 뿐 아니라 데이터의 수정, 삭제 성능도 향상 시킬 수 있는데 그 이유는 수정, 삭제 과정 또한 조회 과정이 선행되어야하기 때문이다.

단점 👎

과도한 인덱스 처리는 오히려 검색 성능을 하락시킬 수 있다.

인덱스를 사용하기위해서는 인덱스를 위한 추가적인 저장공간이 필요하다.


변화구 질문 ⚾

면접에서 이런 질문을 받으면 어떻게 대답해야 할까?

1. 인덱스는 어떤 자료 구조로 이루어져 있나요 ?

인덱스 구현은 여러 자료구조로 할 수 있다.

대표적으로는 B+Tree 구조를 사용한다.

+에서도 알 수 있듯 B-Tree 구조를 개선한 자료구조이다.

B-Tree 구조

Balanced Tree로 노드가 여러 키 값을 가질 수 있는 트리 구조이다.

한 노드가 여러 키 값을 가질 수 있다는 특징덕분에 트리 구조의 깊이를 줄일 수 있고, 빠르게 검색이 가능하다.

모든 노드에 Key-Value를 저장한다.

B+Tree 구조

B-Tree와 비슷하지만 더 다양한 특징을 가지고 있다.

리프노드에만 데이터를 저장하고 이 리프노드들이 Linked List형태로 저장되어 순차 검색에 장점이 있다.

내부 노드에는 키를 저장하기 때문에 메모리 효율성 측면에서 장점이 있다.

🤔 B+Tree 구조를 인덱스에 사용하는 이유

크게 두가지 이유가 있다.

  1. 범위 검색에 최적화 되어있다.
    리프 노드가 LinkedList형태로 연결되어 있기 때문에 특정 범위에 대한 검색 속도가 빠르다.
  1. 메모리 효율이 좋다.
    리프노드에 데이터를 저장하고 내부노드에는 키 값을 저장하기 때문에 더 많은 양의 키를 저장할 수 있어 메모리 효율에서 장점을 가진다.

2. MySQL의 스캔 방식은 뭐가 있죠?

인덱스를 하기위해서는 인덱스 스캔이 필요하다.

쿼리를 처리하면서 테이블의 데이터를 읽기 전에 인덱스를 먼저 탐색해보는 과정이다.

이 인덱스 스캔 과정도 여러 종류가 존재하는데 크게 세가지만 살펴보겠다.


  1. 풀 인덱스 스캔(인덱스 풀 스캔)
    이름에서도 알 수 있듯 모든 인덱스들을 살펴보는 방식이다.

데이터를 모두 살피지않고 인덱스를 살피는 것이기때문에 인덱스로써의 이점은 존재하지만 인덱스의 양이 많다면 이 또한 효율적이지 않을 수 있다.

SELECT * FROM table ORDER BY indexed_column;

  1. 범위 스캔(레인지 스캔)
    특정 범위만 잡아 스캔하는 방식이다. SQL문에 조건을 주고 해당 조건 부분의 인덱스만 스캔한다.
SELECT * FROM table WHERE indexed_column BETWEEN 10 AND 20;

위의 예제에는 Between을 통해 사이값에 대한 조건을 줬고, 이 밖에도 <, >, Like 등의 연산자를 사용해 조건을 줄 수 있다.


  1. 루스 인덱스 스캔
    영어로 loose, 루즈하다 할때, 루스이다.

번역하면 느슨한인데 듬성듬성하게 인덱스를 스캔하는 방법이다.

GroupBy로 그룹화 되었거나 Distinct로 중복을 제거한 경우 사용한다.

SELECT DISTINCT indexed_column FROM table

인덱스 사용에 대해

인덱스는 우선 안쓰는것보다는 쓰는게 훨씬 좋다.

하지만 적당한 곳에 적당한 방법으로 사용된 인덱스가 성능면에서 훨씬 유리하다.

실제로 인덱스 레인지 스캔의 경우 전체 레코드의 20~25%를 읽어야한다면 풀 스캔이 오히려 효율이 좋다.

과도한 인덱스를 줄이고 때에 맞는 인덱스 기법과 스캔기법을 활용해야한다.

참고

면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!

profile
누군가의 롤모델이 될 때까지😇

0개의 댓글