티스토리 뷰

IT/Index

📌 인덱스 완전 정복 - 인덱스란 무엇이고, 왜 중요한가?

Stv 2025. 7. 28. 22:49

목차


    이번 포스팅에서는 "인덱스"의 개념을 기초부터 시작해, 실무에서 왜 중요한지, 어떻게 성능에 영향을 미치는지 깊이 있게 알아보도록 하자. 단순 이론을 넘어서 Explain Plan 해석이나 인덱스 사용 시 주의사항도 함께 다룰 예정이다.


    ✅1. 인덱스란?

    인덱스(Index)는 테이블에서 데이터를 더 빠르게 조회하기 위한 자료구조이다.
    • 마치 책의 목차처럼, 원하는 데이터를 빠르게 찾을 수 있게 도와줌
    • 정렬된 데이터를 참조해서 원하는 레코드로 바로 Jump하는 방식

    예시 : 

    수천 개의 책 중에서 "A로 시작하는 단어"만 찾으려면 처음부터 훓지 않고, 목차(인덱스)를 보고 곧바로 해당 위치로 접근하듯, DB도 전체 테이블 스캔 없이 인덱스를 활용해 빠르게 접근할 수 있음


    ✅2. 인덱스를  왜 사용할까?

    상황 인덱스 없을 때 인덱스 있을 때
    SELECT * FROM USER WHERE NAME = '홍길동' 전체 테이블 스캔 인덱스를 통해 곧바로 NAME = '홍길동' 위치로 이동

     

    • 성능 향상 : 특히 대용량 테이블에서 수십, 수백 배 이상 빨라질 수 있음
    • WHERE 조건, JOIN, ORDER BY, GROUP BY 등에 인덱스가 있으면 효율적

    ✅3. 인덱스의 구조 : B-Tree

    대부분의 RDBMS (Oracle, MySQL InnoDB 등)는 B-Tree 기반 인덱스를 사용한다.

    • 균형 트리 구조로서, 검색/삽입/삭제 모두O(log N)의 성능 보장
    • 리프 노드에 실제 레코드 주소(ROWID)가 존재
    • 왼쪽에서 오른쪽으로 오름차순 정렬된 구조 

    📌인덱스를 타고 내려가면서 중간값 기준으로 비교 -> 빠른 탐색 가능


    ✅4. 인덱스 생성 예시

    CREATE INDEX idx_user_name ON user(name);
    • NAME 컬럼에 대해 인덱스 생성
    • 이후 WHERE NAME = '홍길동' 사용 시 성능 향상

    ✅5. 인덱스는 만능일까?

    모든 쿼리에 인덱스가 도움이 되지는 않습니다!
    • INSERT/UPDATE/DELETE 성능 저하 (인덱스도 갱신 필요)
    • 지나치게 많은 인덱스는 오히려 부하 증가
    • WHERE 조건이 범위를 넓게 잡거나 함수 연산 시 -> 인덱스 사용 못함

    예)

    -- 아래는 인덱스 사용 불가!
    WHERE UPPER(name) = '홍길동'

    ✅6. 실무에서 인덱스가 중요한 이유

    • 대용량 테이블 (100만건 이상)에서는 Full Table Scan이 치명적
    • 잘못된 인덱스로 인해 쿼리 성능이 급격히 떨어질 수 있음
    • Explain Plan으로 인덱스 스캔 vs Full Scan 구분 필요

    ✅7. 인덱스 종류 개요 

    종류 설명
    단일 인덱스 하나의 컬럼에만 적용
    복합 인덱스 여러 컬럼을 조합
    유니크 인덱스  중복 허용 X (PK에 기본 적용)
    함수 기반 인덱스 컬럼에 합수 적용한 결과 기반
    비트맵 인덱스 Cardinality 낮은 컬럼에 유리
    Reverse 키 인덱스 랜덤값 분산용 (전화번호 등)

    💡 마무리 정리

    항목 요약
    인덱스 목적 빠른 검색 성능
    내부 구조 B-Tree 기반 탐색
    생성 시기 WHERE 조건, JOIN 대상, ORDER BY 컬럼 
    주의 사항 너무 많은 인덱스는 오히려 부하

    🔜 다음 포스팅에서는 인덱스 완전 정복이라는 주제로 다뤄볼 예정이다. 단일 인덱스 VS 복합 인덱스 실무에서 언제, 어떻게 적용 해야할까?