🔥 1. INDEX란?

📖 책 색인(Index)과 비교

  • 색인이 없는 경우: 책의 첫 페이지부터 끝까지 한 장씩 넘기며 단어를 찾는다. (Full Scan)
  • 색인이 있는 경우: 색인을 보고 해당 페이지로 바로 점프한다. (Index Scan)

📌 데이터베이스에서도 같은 원리로 동작!
INDEX를 활용하면 특정 데이터를 빠르게 검색할 수 있다.


🔥 2. INDEX가 필요한 이유

🎮 예제: MMORPG 게임 서버

  • accounts 테이블에서 특정 유저의 정보를 찾으려면?
SELECT * FROM accounts WHERE accountName = 'rookiss';
  • 유저가 수백만 명이라면?
    → 인덱스 없이 검색하면 전체 테이블을 스캔(Full Scan) 해야 함
    → 성능 저하 (속도 느려짐)

📌 INDEX를 사용하면?

  • accountName 컬럼에 INDEX를 설정하면 빠르게 검색 가능
  • 마치 책에서 색인을 보고 특정 페이지로 이동하는 것과 동일한 원리

🔥 3. INDEX의 단점

📌 모든 컬럼에 INDEX를 설정하면 안 되는 이유

  • 데이터 변경(INSERT, UPDATE, DELETE) 속도가 느려짐
    → INDEX를 업데이트해야 하므로 추가적인 연산이 발생
  • 너무 많은 데이터를 포함하면 효과가 떨어짐
    class 컬럼(마법사, 전사, 궁수 등)에 INDEX를 걸면, 특정 직업을 검색할 때 너무 많은 결과가 반환될 수 있음

INDEX는 "종류가 많고 중복이 적은 데이터"에 설정하는 것이 가장 효과적!
Primary Key가 INDEX에 적합한 이유도 바로 이것!


🔥 4. INDEX의 종류

📌 📖 색인의 유형
1. Clustered Index (클러스터형 인덱스)

  • 데이터 자체가 정렬된 형태로 저장됨
  • 테이블당 1개만 존재 (정렬 기준이 하나만 가능)
  • 📌 "영한 사전처럼 알파벳 순서로 정렬된 형태"
  • Primary Key는 기본적으로 Clustered Index로 설정됨
  1. Non-Clustered Index (비클러스터형 인덱스)
    • 데이터 정렬과는 별도로 관리되는 색인 테이블
    • 테이블당 여러 개 존재 가능
    • 📌 "책의 색인처럼 별도로 관리"
    • 특정 열에 대한 검색 속도를 향상시킴

📌 차이점 비교
| 구분 | Clustered Index | Non-Clustered Index |
|----------------|--------------------------------|--------------------------------|
| 데이터 저장 방식 | 데이터 자체가 정렬됨 | 별도의 색인 테이블로 관리됨 |
| 개수 제한 | 테이블당 1개만 가능 | 여러 개 생성 가능 |
| 예시 | Primary Key | 일반 검색을 위한 색인 |
| 활용 예시 | accountId (PK) | accountName (닉네임 검색용) |


🔥 5. INDEX 실습 (SQL 예제)

📌 1) Primary Key를 이용한 Clustered Index

-- Primary Key는 기본적으로 Clustered Index로 설정됨
ALTER TABLE accounts
ADD CONSTRAINT PK_Account PRIMARY KEY (accountId);

📌 결과

  • accountIdPrimary Key + Clustered Index로 설정됨
  • 테이블이 accountId 기준으로 정렬된 형태로 저장됨

📌 2) 일반 검색을 위한 Non-Clustered Index

-- accountName 컬럼에 일반 인덱스 생성 (닉네임 검색 속도 향상)
CREATE INDEX i1 ON accounts(accountName);

📌 결과

  • accountName이 Non-Clustered Index로 추가됨
  • 검색 속도 향상 (WHERE accountName = 'rookiss')

📌 3) INDEX 삭제

DROP INDEX accounts.i1;

📌 결과

  • accountName에 걸려 있던 Non-Clustered Index 제거

📌 4) UNIQUE 제약 조건과 함께 INDEX 설정

-- 계정 이름은 중복이 불가능하므로 UNIQUE INDEX 설정
CREATE UNIQUE INDEX i2 ON accounts(accountName);

📌 결과

  • 중복된 accountName 삽입 불가
  • SELECT 시 빠르게 검색 가능

📌 5) CLUSTERED INDEX 수동 생성

-- CLUSTERED INDEX를 특정 컬럼에 수동 적용 (보통 PK에 적용)
CREATE CLUSTERED INDEX i3 ON accounts(accountName);

📌 결과

  • accountName 기준으로 데이터가 정렬됨
  • 일반적으로 PK에 적용되므로, 다른 컬럼에는 거의 사용하지 않음

📌 6) 복합 INDEX 설정

-- 두 개 이상의 컬럼을 조합한 INDEX
CREATE INDEX i4 ON accounts(accountName, coins);

📌 결과

  • accountName + coins 두 개의 컬럼을 동시에 색인
  • 특정 닉네임과 코인 조건을 함께 검색할 때 성능 향상

🔥 6. INDEX 성능 테스트

📌 실제 INDEX가 적용되었는지 확인하는 방법

SELECT * FROM accounts WHERE accountName = 'rookiss';

📌 Ctrl + L (Execution Plan 확인)

  • Table Scan → 인덱스 없음 (전체 테이블 탐색) ❌
  • Index Seek → 인덱스 사용 (빠른 검색) ✅

정리 요약

개념설명
INDEX란?데이터를 빠르게 검색하기 위한 색인
Clustered Index데이터가 정렬된 상태로 저장됨 (테이블당 1개)
Non-Clustered Index데이터 정렬과 별도로 LOOKUP 테이블 형태로 색인 관리
INDEX의 단점너무 많이 사용하면 INSERT/UPDATE 속도 저하
INDEX 적용 예시Primary Key, 검색이 자주 되는 컬럼, 중복이 적은 컬럼

🎯 INDEX 사용 실전 가이드

언제 INDEX를 사용할까?

  • Primary Key는 기본적으로 Clustered Index
  • 자주 조회되는 accountName, email 같은 컬럼에 Non-Clustered Index
  • class(직업), gender(성별)처럼 중복이 많은 값은 인덱스 비효율적

INDEX 사용 주의점

  • INSERT, UPDATE 성능 저하 가능
  • 데이터 변경이 빈번한 테이블에는 최소한으로 사용
  • 색인된 컬럼을 자주 수정하면 오히려 성능 저하

profile
李家네_공부방

0개의 댓글