📌 데이터베이스에서도 같은 원리로 동작!
INDEX를 활용하면 특정 데이터를 빠르게 검색할 수 있다.
accounts 테이블에서 특정 유저의 정보를 찾으려면?SELECT * FROM accounts WHERE accountName = 'rookiss';
📌 INDEX를 사용하면?
accountName 컬럼에 INDEX를 설정하면 빠르게 검색 가능 📌 모든 컬럼에 INDEX를 설정하면 안 되는 이유
class 컬럼(마법사, 전사, 궁수 등)에 INDEX를 걸면, 특정 직업을 검색할 때 너무 많은 결과가 반환될 수 있음✅ INDEX는 "종류가 많고 중복이 적은 데이터"에 설정하는 것이 가장 효과적!
✅ Primary Key가 INDEX에 적합한 이유도 바로 이것!
📌 📖 색인의 유형
1. Clustered Index (클러스터형 인덱스)
📌 차이점 비교
| 구분 | Clustered Index | Non-Clustered Index |
|----------------|--------------------------------|--------------------------------|
| 데이터 저장 방식 | 데이터 자체가 정렬됨 | 별도의 색인 테이블로 관리됨 |
| 개수 제한 | 테이블당 1개만 가능 | 여러 개 생성 가능 |
| 예시 | Primary Key | 일반 검색을 위한 색인 |
| 활용 예시 | accountId (PK) | accountName (닉네임 검색용) |
-- Primary Key는 기본적으로 Clustered Index로 설정됨
ALTER TABLE accounts
ADD CONSTRAINT PK_Account PRIMARY KEY (accountId);
📌 결과
accountId가 Primary Key + Clustered Index로 설정됨 accountId 기준으로 정렬된 형태로 저장됨-- accountName 컬럼에 일반 인덱스 생성 (닉네임 검색 속도 향상)
CREATE INDEX i1 ON accounts(accountName);
📌 결과
accountName이 Non-Clustered Index로 추가됨WHERE accountName = 'rookiss')DROP INDEX accounts.i1;
📌 결과
accountName에 걸려 있던 Non-Clustered Index 제거-- 계정 이름은 중복이 불가능하므로 UNIQUE INDEX 설정
CREATE UNIQUE INDEX i2 ON accounts(accountName);
📌 결과
accountName 삽입 불가SELECT 시 빠르게 검색 가능-- CLUSTERED INDEX를 특정 컬럼에 수동 적용 (보통 PK에 적용)
CREATE CLUSTERED INDEX i3 ON accounts(accountName);
📌 결과
accountName 기준으로 데이터가 정렬됨-- 두 개 이상의 컬럼을 조합한 INDEX
CREATE INDEX i4 ON accounts(accountName, coins);
📌 결과
accountName + coins 두 개의 컬럼을 동시에 색인📌 실제 INDEX가 적용되었는지 확인하는 방법
SELECT * FROM accounts WHERE accountName = 'rookiss';
📌 Ctrl + L (Execution Plan 확인)
| 개념 | 설명 |
|---|---|
| INDEX란? | 데이터를 빠르게 검색하기 위한 색인 |
| Clustered Index | 데이터가 정렬된 상태로 저장됨 (테이블당 1개) |
| Non-Clustered Index | 데이터 정렬과 별도로 LOOKUP 테이블 형태로 색인 관리 |
| INDEX의 단점 | 너무 많이 사용하면 INSERT/UPDATE 속도 저하 |
| INDEX 적용 예시 | Primary Key, 검색이 자주 되는 컬럼, 중복이 적은 컬럼 |
✅ 언제 INDEX를 사용할까?
Primary Key는 기본적으로 Clustered IndexaccountName, email 같은 컬럼에 Non-Clustered Indexclass(직업), gender(성별)처럼 중복이 많은 값은 인덱스 비효율적✅ INDEX 사용 주의점