DB/Mysql

[Mysql] 인덱스는 어떻게 동작할까?

hoonylab 2025. 4. 17. 14:42
728x90
반응형

🔍 인덱스는 어떻게 작동하나요?

인덱스는 책의 목차처럼, 원하는 데이터를 더 빠르게 찾을 수 있도록 도와주는 역할을 합니다.

📘 예시

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(50),
  email VARCHAR(100),
  age INT
);

-- email 컬럼에 인덱스를 생성
CREATE INDEX idx_email ON users(email);

-- email을 조건으로 검색
SELECT * FROM users WHERE email = 'test@example.com';

이 경우, MySQL은 전체 테이블을 스캔하지 않고 인덱스를 먼저 탐색해 해당 데이터를 빠르게 찾습니다.


🚫 어떤 경우에 인덱스를 사용하지 않는 것이 좋을까요?

모든 상황에서 인덱스가 유리한 것은 아닙니다. 오히려 성능을 떨어뜨릴 수 있는 경우도 있습니다.

✅ 1. 데이터 양이 아주 적은 테이블

SELECT * FROM settings WHERE name = 'site_title';

데이터가 10건 정도인 소형 테이블이라면, 인덱스를 사용하는 것보다 풀스캔이 더 빠를 수 있습니다.

✅ 2. 자주 변경되는 컬럼

UPDATE posts SET views = views + 1 WHERE id = 1001;

views처럼 자주 업데이트되는 컬럼에 인덱스가 있다면, 인덱스도 함께 갱신되어 성능에 부하가 생깁니다.

✅ 3. WHERE절에 함수나 계산식이 포함된 경우

SELECT * FROM users WHERE YEAR(birthdate) = 1990;  -- ❌ 인덱스 사용 못 함

함수나 계산식이 들어가면 인덱스가 무시됩니다.

대안:

SELECT * FROM users WHERE birthdate BETWEEN '1990-01-01' AND '1990-12-31';

✅ 4. 와일드카드 검색에서 앞에 %가 있는 경우

SELECT * FROM users WHERE email LIKE '%gmail.com';  -- ❌ 인덱스 사용 못 함

와일드카드가 앞에 있으면 인덱스를 사용할 수 없습니다.

대안:

SELECT * FROM users WHERE email LIKE 'john%';  -- ✅ 인덱스 사용 가능

💡 정리

상황 인덱스 사용 O 인덱스 사용 X
데이터 검색 성능 향상
소량 데이터 조회
자주 갱신되는 컬럼
WHERE에서 컬럼 그대로 비교
WHERE에서 함수/연산 사용
LIKE에서 앞에 % 없음
LIKE에서 앞에 % 있음

TIP: 인덱스를 만들기 전에는 항상 EXPLAIN으로 실행 계획을 확인해보는 습관이 중요해요!

728x90
반응형