🌳 고급 DB
데이터베이스 인덱스는 언제 만들어야 하나요?
쉽게 이해하기
책 뒤에 있는 색인을 생각해보세요. '인공지능'이라는 단어를 찾으려면 색인을 보고 바로 페이지로 가면 되죠. 인덱스 없이 처음부터 끝까지 읽는 것보다 훨씬 빠르잖아요? 하지만 책을 쓸 때는 본문 뿐 아니라 색인도 업데이트해야 해서 시간이 더 걸려요. 데이터베이스 인덱스도 똑같은 trade-off가 있어요.
핵심 정리
자주 검색하는 컬럼에 인덱스를 만들면 속도가 빨라지지만, 쓰기 성능은 느려질 수 있어요
자세히 알아보기
인덱스는 데이터베이스 성능 최적화의 핵심이에요. 하지만 무작정 만들면 오히려 독이 될 수 있어서 전략이 필요해요.
언제 만들어야 할까요? 첫째, WHERE 절에 자주 나오는 컬럼이에요. `SELECT * FROM users WHERE email = ?` 같은 쿼리가 많다면 email에 인덱스를 만들어야 해요. 둘째, JOIN 조건에 쓰이는 컬럼이에요. `INNER JOIN orders ON users.id = orders.user_id`라면 user_id에 인덱스가 필요하죠. 셋째, ORDER BY나 GROUP BY에 쓰이는 컬럼도 후보예요.
반대로 만들지 말아야 할 때도 있어요. 데이터가 적은 테이블(수천 건 이하)은 인덱스가 오히려 느려요. 풀 스캔이 더 빠르거든요. 또 업데이트가 잦은 컬럼도 피해야 해요. 매번 쓸 때마다 인덱스도 갱신되니까 쓰기 성능이 크게 떨어져요. 중복 값이 많은 컬럼(성별, 불린 값)도 효과가 미미해요.
실무 전략: EXPLAIN 명령어로 쿼리 실행 계획을 확인하세요. 'Using filesort'나 'Using temporary'가 보이면 인덱스가 필요하다는 신호예요. 복합 인덱스(여러 컬럼)를 만들 때는 순서가 중요해요. `INDEX(name, age)`와 `INDEX(age, name)`은 다른 인덱스예요. 카디널리티(유니크 값의 비율)가 높은 컬럼을 앞에 두는 게 일반적이에요. 인덱스는 만들기보다 유지보수가 더 어려워요.