데이터베이스에서 인덱스(Index)란? 왜 필요 할까?
두꺼운 책의 맨 앞에 목차가 기재되어 있으면 내가 원하는 내용을 더 빨리 탐색할 수 있다. 반대로 목차가 없으면 두꺼운 책 내용 중에 어떤 내용을 어디에서 찾을지 모르기 때문에 전체를 다 탐색해야 한다. 시간과 에너지가 많이 든다.
이 때문에 어떤 순서대로 정렬된 목록(색인)의 필요성을 느낀다. DB에서 이와 같은 기능을 하는 것이 인덱스이다.
- 즉, 인덱스는 데이터베이스에서 데이터를 빠르게 찾아낼 수 있도록 돕는 자료구조이다.
- 데이터를 찾기 위한 '색인'으로 데이터의 주소록이라고 부를 수 있다.
- 인덱스가 있으면 전체 Pull Scan 할 필요없다.
인덱스의 구성
- 인덱스는 키(key)와 포인터들로 구성되어있다.
- DB에서 추출한 일부 데이터인 키는 특정 데이터를 고유하게 식별하게 한다.
- 포인터는 키와 연관된 데이터가 저장된 실제 위치를 가르킨다.
인덱스 동작 과정
- (자주 사용되는 컬럼인) Name 컬럼에 인덱싱을 해놓은 예시
- 인덱스를 통해 Name을 먼저 조회하고, Name의 Location 값을 통해 테이블의 값을 조회한다.
장점 : 인덱스는 왜 필요한가?
테이블 전체를 스캔하지 않을 수 있다 : 인덱스의 활용이 DB 성능 최적화에 큰 영향을 미친다.
--> 검색 속도 향상 : 인덱스는 데이터의 검색 속도를 향상시키기 위해 사용된다.
--> 쿼리 최적화 : 쿼리를 실행할 때 테이블 전체를 스캔하지 않고 인덱스를 사용해 빠르게 데이터를 찾을 수 있다.
단점
- 관리 오버헤드(overhead) : 인덱스를 생성, 유지, 관리하는 데 시간과 공간이 소모 된다.
- 쓰기 성능 저하 : 인덱스 정보를 갱신하는데 비용이 추가됩니다. 다시 말해, 데이터를 삽입, 수정, 삭제할 때 인덱스도 함께 업데이트해야 하므로 쓰기 성능이 저하될 수 있다.
인덱스 사용 시 고려 사항
1) 높은 카디널리티(Cardinality) 고려하기
- 카디널리티가 높은 컬럼을 우선적으로 인덱싱 하는 것이 유리합니다. 카디널리티가 높으면 고유한 값이 많다는 것을 의미한다.
- 즉, 인덱스 특정 컬럼을 기준으로 중복도가 낮은 데이터(주민번호, 전화번호, 이메일 등)는 카디널리티가 높습니다. 이 경우 인덱스를 통해 행(row)를 빠르게 찾을 수 있다.
2) 쿼리에서 자주 사용되는 조건(WHERE 절, JOIN 조건, ORDER BY 절 등)에 해당하는 열에 인덱스를 고려한다.
3) 너무 많은 인덱스 생성하지 않기 : 인덱스가 많으면 오버헤드 증가 및 쓰기 성능 저하 될 수 있다.
참고, 데이터를 더 쉽게 찾도록 돕는 인덱스 구조
- 이진 탐색 트리(Binary Search Tree)
- B-Tree 인덱스: 가장 일반적으로 사용되는 인덱스
- B+Tree : B-Tree에서 발전된 형태
인덱스 유형
- 복합 인덱스 : 여러 컬럼을 한꺼번에 인덱싱
- Full-Text 인덱스 : 전문 텍스트 검색을 도움
- 공간 인덱스 : 공간 데이터를 위함
https://kyungyeon.dev/posts/66
https://wildeveloperetrain.tistory.com/131
https://www.youtube.com/watch?v=iNvYsGKelYs
'개발기초' 카테고리의 다른 글
FULLTEXT 인덱스 개요, 특징과 작동원리 (0) | 2023.05.10 |
---|---|
양방향 LIKE 연산자(% LIKE %) 사용시 인덱스 (0) | 2023.05.10 |
정규 표현식에 대해서 (0) | 2023.04.25 |
클라우드 (Cloud) 컴퓨팅의 종류와 특징 (0) | 2023.04.24 |
테스트 (Testing)에 대해서 (0) | 2023.04.21 |
댓글