[ 목차 ]
인덱스란?
인덱스란 DB에서 테이블에 대한 동작의 속도를 높여주는 자료구조로, 책의 목차처럼 특정 데이터를 빠르게 찾기 위해 만들어진 DB 내의 추가적인 구조이다.
DBMS도 DB 테이블의 모든 데이터를 검색해서 원하는 결과를 가져오기에는 시간이 오래 걸리기 때문에 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 삼아 인덱스를 만들어 둘 수 있다.
인덱스의 장단점
장점
- 검색 속도 향상 : 특정 조건으로 데이터를 조회할 때 성능이 대폭 개선된다.
- 쿼리 최적화 : SELECT, JOIN, ORDER BY, GROUP BY와 같은 쿼리 실행 시간이 단축된다.
단점
- 쓰기 작업 비용 증가 : 데이터 삽입, 수정, 삭제 시 인덱스 갱신 작업이 추가로 필요하다.
- 추가 저장 공간 필요 : 인덱스를 저장하기 위한 추가적인 메모리와 디스크 공간이 필요하다.
인덱스를 쓰면 좋은 경우
- 규모가 작지 않은 테이블
- DML(INSERT, UPDATE, DELETE) 작업이 자주 발생하지 않는 컬럼
- JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
- 카디날리티(cardinality)가 높은(중복도가 낮은) 컬럼
인덱스의 자료구조
인덱스는 데이터를 효율적으로 검색하기 위해 다양한 알고리즘으로 구현된다.
B-Tree (Balanced Tree):
- 가장 널리 사용되는 인덱스 구조.
- 구조 : 균형 이진 트리(Balanced Tree) 기반.
- 특징 :
- 대부분의 MySQL 인덱스는 B-Tree 구조를 사용.
- 데이터가 정렬된 상태로 유지되어 범위 검색에 적합.
- 검색, 삽입, 삭제의 시간 복잡도가 O(log n)으로 일정.
- 사용 예: 일반적인 SELECT 쿼리, 범위 조건 (BETWEEN, <, >).
Hash Table:
- 키-값 기반으로 데이터를 저장하여 빠른 검색 제공.
- 구조 : 해시 함수(Hash Function)를 이용하여 값을 검색.
- 특징 :
- 특정 값을 정확히 검색할 때 빠름.
- 범위 검색에는 부적합(BETWEEN, <, > 사용 불가).
- 사용 예: 메모리 기반 엔진(예: MEMORY 테이블)에서 주로 사용.
인덱스의 종류
인덱스의 타입은 크게 두가지로 나뉘는데 클러스터링 인덱스와 논-클러스터링 인덱스로 나뉘어 진다.
클러스터링 인덱스는 처음부터 정렬이 되어있는 사전과 같은 개념이고,
논-클러스터링 인덱스는 책 뒤의 찾아보기 부록의 개념과 비슷하다.
클러스터링 인덱스
- 데이터가 물리적 순서에 따라 정렬된다.
- 그래서 클러스터링 인덱스 생성 시에는 데이터 페이지 전체가 다시 정렬된다.
- 한 테이블에 하나의 클러스터링 인덱스만 생성이 가능하다. (ex : Primary Key)
- 원래 인덱스는 생성 시 데이터의 배열 정보를 따로 저장하는 공간을 사용하나, 클러스터링 인덱스는 따로 저장하는 공간을 적게 사용하고, 데이블 공간 자체를 활용한다.
- 장점: 논-클러스터링 인덱스보다 범위 검색(e.g., BETWEEN, ORDER BY)에서 성능이 뛰어나다.
- 단점: 삽입/삭제 시 데이터 재정렬이 필요해 성능이 저하된다.
클러스터링 인덱스 생성 시 페이지 변화
논-클러스터링 인덱스
- 데이터의 물리적 순서와는 독립적으로 별도의 인덱스 구조가 생성된다.
- 논-클러스터링 인덱스의 리프 페이지는 데이터가 아니라 데이터가 위치하는 주소값(RID)이다.
- 한 테이블에 여러 개 생성이 가능하다. 하지만 함부로 사용할 경우, 오히려 성능을 떨어뜨릴 수 있다.
- 장점: 다양한 검색 조건에 맞춰 여러 인덱스를 생성이 가능하다.
- 단점: 클러스터링 인덱스보다 검색 속도는 느릴 수 있다.
논-클러스터링 인덱스 생성 시 페이지 변화
인덱스 사용 시 주의사항
- 인덱스 남용 금지 :
- 모든 컬럼에 인덱스를 생성하면 오히려 쓰기 작업의 성능이 크게 저하될 수 있다.
- 꼭 필요한 컬럼에만 인덱스를 생성한다.
- 인덱스와 저장 공간 :
- 인덱스는 추가적인 저장 공간을 소모하므로, 데이터베이스 크기와 성능을 고려해야 한다.
- 쿼리 최적화와의 관계:
- 잘못된 쿼리 작성은 인덱스의 효과를 제한할 수 있다. (예: 인덱스가 있는 컬럼에 함수 적용 → 인덱스 미사용).
- 범위 검색과 해시 인덱스:
- 범위 검색이 필요한 경우, B-Tree 기반 인덱스를 선택한다.
- 데이터 변경 주기 고려:
- 데이터 삽입/수정/삭제가 잦은 테이블에서는 최소한의 인덱스만 유지한다.
- 인덱스는 데이터 검색 속도를 높이는 강력한 도구지만, 설계와 사용 방법에 따라 성능이 크게 좌우된다. 때문에 어떤 인덱스를 사용할지 그리고 사용 시 주의사항을 고려해서, 필요한 곳에만 최소한의 인덱스를 적용하도록 하자.
출처
데이터베이스 인덱스
데이터베이스의 인덱스에 대해서 알자보자.
velog.io
https://www.youtube.com/watch?v=edpYzFgHbqs
[MYSQL] 📚 인덱스(index) 핵심 설계 & 사용 문법 💯 총정리
인덱스의 개념 인덱스란 데이터의 저장(INSERT, UPDATE, DELETE) 의 성능을 희생하고 그 대신에 데이터의 읽기 속도를 높이는 테이블의 동작속도(조회)를 높여주는 자료구조이다. 쉽게 예를 들어보면
inpa.tistory.com
'DB' 카테고리의 다른 글
트랜잭션 격리 수준 & 동시성 제어 (0) | 2024.12.26 |
---|---|
트랜잭션 / ACID (0) | 2024.12.26 |
클러스터링 / 레플리케이션 (2) | 2024.12.06 |
정규화 / 반정규화 (0) | 2024.11.28 |
DB / DBMS / SQL (3) | 2024.11.08 |