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


검색속도 향상을 목적으로 책의 색인 부분과 같다.
저장되는 컬럼 값을 사용해 항상 정렬된 상태를 유지한다.
검색성능 향상 뿐 아니라 데이터의 수정, 삭제 성능도 향상 시킬 수 있는데 그 이유는 수정, 삭제 과정 또한 조회 과정이 선행되어야하기 때문이다.
과도한 인덱스 처리는 오히려 검색 성능을 하락시킬 수 있다.
인덱스를 사용하기위해서는 인덱스를 위한 추가적인 저장공간이 필요하다.
면접에서 이런 질문을 받으면 어떻게 대답해야 할까?
인덱스 구현은 여러 자료구조로 할 수 있다.
대표적으로는 B+Tree 구조를 사용한다.
+에서도 알 수 있듯 B-Tree 구조를 개선한 자료구조이다.
Balanced Tree로 노드가 여러 키 값을 가질 수 있는 트리 구조이다.
한 노드가 여러 키 값을 가질 수 있다는 특징덕분에 트리 구조의 깊이를 줄일 수 있고, 빠르게 검색이 가능하다.
모든 노드에 Key-Value를 저장한다.
B-Tree와 비슷하지만 더 다양한 특징을 가지고 있다.
리프노드에만 데이터를 저장하고 이 리프노드들이 Linked List형태로 저장되어 순차 검색에 장점이 있다.
내부 노드에는 키를 저장하기 때문에 메모리 효율성 측면에서 장점이 있다.
크게 두가지 이유가 있다.
인덱스를 하기위해서는 인덱스 스캔이 필요하다.
쿼리를 처리하면서 테이블의 데이터를 읽기 전에 인덱스를 먼저 탐색해보는 과정이다.
이 인덱스 스캔 과정도 여러 종류가 존재하는데 크게 세가지만 살펴보겠다.
데이터를 모두 살피지않고 인덱스를 살피는 것이기때문에 인덱스로써의 이점은 존재하지만 인덱스의 양이 많다면 이 또한 효율적이지 않을 수 있다.
SELECT * FROM table ORDER BY indexed_column;
SELECT * FROM table WHERE indexed_column BETWEEN 10 AND 20;
위의 예제에는 Between을 통해 사이값에 대한 조건을 줬고, 이 밖에도 <, >, Like 등의 연산자를 사용해 조건을 줄 수 있다.
번역하면 느슨한인데 듬성듬성하게 인덱스를 스캔하는 방법이다.
GroupBy로 그룹화 되었거나 Distinct로 중복을 제거한 경우 사용한다.
SELECT DISTINCT indexed_column FROM table
인덱스는 우선 안쓰는것보다는 쓰는게 훨씬 좋다.
하지만 적당한 곳에 적당한 방법으로 사용된 인덱스가 성능면에서 훨씬 유리하다.
실제로 인덱스 레인지 스캔의 경우 전체 레코드의 20~25%를 읽어야한다면 풀 스캔이 오히려 효율이 좋다.
과도한 인덱스를 줄이고 때에 맞는 인덱스 기법과 스캔기법을 활용해야한다.
면접 질문 내용과 답변의 일부는 기술 면접 구독 서비스 - 매일메일 에 있다.
흥미로웠다면 구독해보는 것도 추천한다!