1. 인덱스란?

인덱스는 데이터베이스 테이블에서 원하는 데이터를 더 빠르게 찾기 위해 사용하는 자료구조야.

2. MySQL 인덱스의 종류

BRIN, GIN은 MySQL에서 지원하지 않고 Partial B-Tree도 거의 사용되지 않음 👉 MySQL에서 거의 모든 경우 B-Tree 기반 인덱스 사용

인덱스 종류 B-Tree 기반? 설명 언제 사용하나?
PRIMARY KEY ✅ Yes (B-Tree) MySQL의 클러스터형 인덱스 (InnoDB 기준)
UNIQUE INDEX ✅ Yes (B-Tree) 중복 방지용 B-Tree 인덱스 1. 중복 방지용 인덱스. 하나의 컬럼 또는 컬럼 조합이 **유일해야 할 때
2.** 이메일, 주민번호, 닉네임처럼 중복되면 안 되는 값을 저장할 때
INDEX (일반 인덱스) ✅ Yes (B-Tree) 가장 기본적인 B-Tree 인덱스 1. 중복 허용. 단순히 검색, 정렬, JOIN 속도를 높이기 위한 인덱스
  1. WHERE 절이나 JOIN 절에 자주 등장하는 컬럼
  2. ORDER BY, GROUP BY 대상이 자주 되는 컬럼
  3. UNIQUE까진 필요 없지만 빠른 검색이 필요한 경우 | | Composite Index (복합 인덱스) | ✅ Yes (B-Tree) | 여러 컬럼을 하나의 B-Tree에 | 1. 두 개 이상 컬럼을 묶어서 인덱싱. 복합 조건 검색 속도 최적화
  4. WHERE A = ? AND B = ?처럼 두 컬럼 이상을 함께 자주 검색할 때 | | FULLTEXT INDEX | ❌ No (B-Tree 아님) | 역 인덱스 (Inverted Index) 구조 | 1. 문자열 전문 검색에 특화된 인덱스. LIKE '%키워드%'보다 훨씬 빠름
  5. 긴 텍스트(본문, 리뷰, 게시글 등)에서 키워드 검색할 때
  6. 단어 단위로 검색하려고 할 때 👉 InnoDB/MyISAM에서만 사용 가능 | | SPATIAL INDEX | ❌ No | R-Tree 구조 사용 (MyISAM 한정) | 1. 위도/경도 등 공간 좌표(GIS) 데이터를 빠르게 조회할 때 👉 MyISAM 엔진만 완전 지원 |

3. 인덱스를 설정하는 기준 (언제 인덱스를 걸어야 할까?)

조건 설명
WHERE 절 자주 사용 예: SELECT * FROM users WHERE email = '[email protected]'
JOIN의 ON절 두 테이블을 자주 조인하는 컬럼에 인덱스를 설정해야 빨라져
ORDER BY / GROUP BY 정렬이나 그룹핑에 자주 쓰이는 컬럼도 인덱스 대상이야
검색 속도 느림 조회할 때 느린 쿼리에 인덱스를 추가해서 성능 개선 가능

4. 인덱스 설정 예시

1. 기본 인덱스


CREATE INDEX idx_user_email ON users(email);

2. 유니크 인덱스

CREATE UNIQUE INDEX idx_user_email_unique ON users(email);

3. 복합 인덱스 (두 개 이상의 컬럼)

CREATE INDEX idx_user_name_email ON users(name, email

WHERE name = ? AND email = ? 같은 복합 조건에서 성능 향상

5. 인덱스 주의사항