일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 명령어
- SQL
- 각데이터베이스별
- DBMS
- c#특징
- 뷰테이블
- Python
- JPA
- spring
- 트랜잭션
- mysql
- analytics4
- network
- API
- mssql
- java
- 4요소
- 차이점
- 티스토리챌린지
- docker
- PostgreSQL
- 자바
- group by
- rebase vs merge
- oracle
- Javascript
- IntelliJ
- 오블완
- git
- Today
- Total
hanker
SQL - 인덱스(index) 사용법, 종류, 정의 본문
SQL에서 인덱스(Index)는 데이터베이스의 검색 속도를 높이는 데 중요한 역할을 한다.
그러나 잘못된 인덱스 설정은 성능을 저하시킬 수 있다.
이번 글에서는 인덱스의 정의, 종류, 그리고 효과적으로 사용하는 방법을 알아보자.
1. 인덱스란?
인덱스는 책의 색인처럼 데이터베이스에서 특정 데이터를 빠르게 찾을 수 있도록 돕는 구조이다.
- 인덱스가 없다면 데이터베이스는 모든 행을 하나씩 탐색하는 풀 스캔(Full Scan)을 수행한다.
- 인덱스는 테이블의 특정 열에 대해 정렬된 데이터를 저장하여 검색 속도를 높인다.
2. 인덱스의 작동 원리
인덱스는 B-tree 구조 또는 해시(Hash)를 기반으로 작동한다.
- B-tree 인덱스: 대부분의 데이터베이스에서 기본적으로 사용하는 인덱스 유형으로, 범위 검색에 유리하다.
- 해시 인덱스: 고유 값 검색에 특화되어 있지만, 범위 검색은 지원하지 않는다.
특성 | B-Tree 인덱스 | 해시 인덱스 |
구조 | 균형 트리 | 해시 테이블 |
지원 연산 | =, <, <=, >, >= 등 | =만 지원 |
정렬 | 정렬된 데이터 유지 | 정렬되지 않음 |
범위 검색 | 가능 | 불가능 |
검색 성능 | O(logN)O(\log N) | O(1)O(1) (충돌 없음 가정) |
적용 사례 | 범위 쿼리, 정렬이 필요한 작업 | 정확한 키 검색 (키-값 매핑에 적합) |
* 범위 검색이 필요한 경우: B-Tree 인덱스
* 정확한 키 검색이 필요한 경우: 해시 인덱스
3. 인덱스의 종류
3.1 기본 키 인덱스 (Primary Key Index)
기본 키는 자동으로 인덱스를 생성하며, 중복과 NULL 값을 허용하지 않는다.
3.2 유니크 인덱스 (Unique Index)
고유 인덱스는 중복 값을 허용하지 않는다.
CREATE UNIQUE INDEX unique_idx ON employees (email);
3.3 일반 인덱스 (Non-Unique Index)
중복 값을 허용하며, 검색 속도를 높이기 위해 사용된다.
CREATE INDEX idx_name ON employees (last_name);
3.4 복합 인덱스 (Composite Index)
여러 열을 결합하여 하나의 인덱스를 생성한다.
CREATE INDEX idx_fullname ON employees (last_name, first_name);
3.5 클러스터링 인덱스 (Clustered Index)
테이블의 데이터 자체를 정렬하며, 하나의 테이블에 하나의 클러스터링 인덱스만 생성할 수 있다.
4. 인덱스 사용 사례
4.1 WHERE 절에 사용
SELECT * FROM employees WHERE last_name = 'Ker';
# 인덱스가 있는 경우 last_name 열을 기준으로 빠르게 데이터를 검색한다.
4.2 JOIN 절에 사용
SELECT E.name, D.department_name
FROM employees E
JOIN departments D
ON E.department_id = D.department_id;
# JOIN 조건 열에 인덱스를 추가하면 테이블 결합 성능이 향상된다.
4.3 ORDER BY와 GROUP BY에 사용
SELECT last_name FROM employees ORDER BY last_name;
# 인덱스가 있으면 정렬 속도가 향상된다.
5. 인덱스 생성 시 주의사항
과도한 인덱스 생성 금지
- 인덱스가 많아지면 삽입, 업데이트, 삭제 성능이 저하된다.
- 필요한 열에만 인덱스를 생성하는게 좋다.
인덱스 선택 열
- 자주 검색되거나 JOIN 조건에 사용되는 열에 인덱스를 생성한다.
인덱스와 데이터 크기
- 데이터 크기가 작거나 테이블의 행 수가 적다면 인덱스 효과가 미미할 수 있다.
고유 값과 중복도
- 인덱스는 고유 값이 많을수록 효과적이다.
- 중복 값이 많으면 성능 향상이 제한적입이다.
6. 인덱스 성능 분석
6.1 실행 계획 확인
데이터베이스는 EXPLAIN 명령어를 사용해 실행 계획을 확인할 수 있다.
EXPLAIN SELECT * FROM employees WHERE last_name = 'ker';
6.2 인덱스 사용 여부 확인
인덱스가 사용되지 않는 경우, 실행 계획에서 Full Table Scan이 표시됩니다.
7. 인덱스 최적화 팁
단일 열보다는 복합 인덱스 활용
- last_name과 first_name으로 검색이 자주 이루어진다면 복합 인덱스를 생성하자
인덱스와 쿼리 조건의 일치
- 쿼리 조건이 인덱스 순서와 일치해야 최적의 성능을 얻을 수 있다.
가급적 SELECT * 지양
- SELECT *는 인덱스를 효과적으로 활용하지 못할 가능성이 높다.
정기적인 인덱스 리빌드
- 데이터베이스 성능을 유지하려면 정기적으로 인덱스를 재구성(Rebuild)하자
SQL에서 인덱스는 성능을 극대화하는 핵심 도구이다.
하지만 모든 경우에 인덱스가 유리한 것은 아니므로, 데이터와 쿼리 패턴에 맞는 전략적 사용이 필요하다.
'DATABASE > SQL' 카테고리의 다른 글
SQL - 뷰(View)를 알아보자 (뷰 테이블, View Table) (0) | 2025.01.09 |
---|---|
SQL - 트랜잭션(Transaction) 가이드 (커밋과 롤백 활용 방법) (0) | 2025.01.06 |
SQL - Window Functions 의 모든 것 (윈도우 함수) (1) | 2025.01.04 |
SQL - 서브쿼리 사용법 (서브쿼리 활용 방법) (0) | 2025.01.03 |
SQL - 테이블 결합, 데이터 통합의 핵심 JOIN 알아보기 (0) | 2025.01.02 |