기술면접 대비 - 인덱스(Index)
오늘은 인덱스와 이전 부트캠프 프로젝트 진행 당시 적용하였던 Full Text Index / Ngram Parser에 대해 다시 한 번 정리해보고자 한다.
Full Table Scan
순차 접근
원하는 데이터를 얻기 위하여 데이터가 저장된 목록 중 모든 데이터 요소를 차례로 조사하여 원하는 데이터를 찾아 내는 방식.
(만약 약 1억 건의 데이터가 있다면 1억 번의 데이터 조회가 발생할 수도)
인덱스(Index)
인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치이다.
일반적으로 책 마지막 장에 있는 '찾아보기'와 유사하다고 할 수 있다.
원하는 내용(데이터)를 얻기 위해 책을 처음부터 끝까지 훑는 것은 상당히 비효율적이기에 '찾아보기'를 보고 원하는 데이터를 얻는 방식, 그것이 바로 인덱싱(Indexing)의 목적이다.
B-TREE(Balanced-TREE)
인덱스는 보통 B-트리라는 자료 구조로 이루어져 있다.
기존 이진트리(Binary-TREE) 구조를 개선하기 위하여 등장하였으며 루트 노드, 리프 노드, 그리고 루트 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다.
B-TREE 구조의 인덱스를 이용한다면 전체 테이블을 탐색하지 않고 훨씬 적은 횟수의 탐색만으로 원하는 데이터에 도달할 수 있다.
Q. 그렇다면 모든 테이블, 모든 속성에 대해 인덱스를 거는 것이 좋을까?
절대 그렇지 않다. 모든 것이 그러하듯 인덱스 과용 또한 절대 좋지 않다.
우선 인덱스 자체가 결코 적지 않은 저장공간을 차지한다. 그렇기에 무분별한 인덱스 생성은 DB에 악영향을 줄 수 있다.
또, 적절한 인덱스 사용은 조회(SELECT) 성능을 향상시켜줄 수 있으나 인덱스가 걸려있는 테이블에서 추가(INSERT), 수정(UPDATE), 삭제(DELETE)가 빈번하게 발생한다면 인덱스 테이블 또한 내부 값들에 대한 정렬을 계속적으로 해줘야할 필요가 있기에 부하를 발생시켜 전체적인 데이터베이스 성능 저하를 가져올 수 있다.
복합인덱스(Composite Index)
복합인덱스(=결합인덱스)란 두 개 이상의 필드(컬럼)을 합쳐서 인덱스를 생성하는 것을 말한다.
복합인덱스의 컬럼 설정 시 고려해야 할 우선순위
1. EQUAL('==')로 사용되는 컬럼
2. ORDER BY(정렬)에 사용되는 컬럼
3. 다중 값(>, < 등)을 출력해야하는 컬럼
4. 카디널리티(Cardianlity)가 높은 컬럼(ex, PK)
지난 부트캠프 최종 프로젝트 당시 검색 기능 제작을 담당하였었다. 최초 제작 당시에는 LIKE %(INPUT)% 과 같은 형태의 SQL문을 바탕으로 검색 기능을 구현하였으나 성능 향상을 위한 리팩터링 과정에서 Full Text Index 적용을 통해 속도 향상을 경험하였었다. 인덱스와 관련된 내용을 정리하는 김에 해당 내용들 또한 다시 한 번 정리해보고자 한다.
Full Text Index
Full Text Index는 긴 문자의 텍스트 데이터 검색에 용이한 MySQL의 부가 기능이다. 이 역시 인덱스의 한 종류이다.
데이터를 토큰 단위로 쪼개어 검색을 용이하게 해준다.
Full Text Index에서는 사용자가 보다 효율적으로 검색을 할 수 있도록 2가지 인덱싱(Indexing) 기법을 제공하는데
하나는 공백이나 DB 방언으로 지정된 Stop-Word를 바탕으로 쪼개는 방식인 Bulit-in Parser 또는 Stop-word Parser이며
다른 하나가 바로 N-gram Parser이다.
N-gram Parser
N-gram이란 문자열을 할당한 토큰의 크기 N만큼 쪼개어 인덱스를 구축하는 Parser이다.
예를 들어 "나는 개발자다."라는 문자열을 2-gram 방식으로 parsing 할 경우 아래와 같은 토큰으로 쪼개지게 된다.
"나는" | "는 " | " 개" | "개발" | "발자" | "자다" | "다."
이 중 토큰 크기가 2개 아닌 "는 "과 " 개"는 제거되어 나머지로 인덱싱 된다.
Reference
면접을 위한 CS 전공지식 노트 - YES24
디자인 패턴, 네트워크, 운영체제, 데이터베이스, 자료 구조, 개발자 면접과 포트폴리오까지!CS 전공지식 습득과 면접 대비, 이 책 한 권이면 충분하다!개발자 면접에서 큰 비중을 차지하는 CS(Comp
www.yes24.com
'🖥CS > 기술면접대비🔎' 카테고리의 다른 글
조인의 종류 (1) | 2023.01.05 |
---|---|
트랜잭션 (0) | 2022.12.30 |
ERD와 정규화 과정 (0) | 2022.12.29 |
http와 https (2) | 2022.12.02 |
[Java] static, final, staic final 차이 (0) | 2022.11.17 |