blog.pisik.club
article thumbnail
728x90

데이터베이스를 다루다 보면, 쿼리가 느려서 답답할 때가 있습니다. “왜 이렇게 오래 걸리지?”라는 고민을 하게 되죠. 이럴 때 유용하게 쓰이는 것이 인덱스(Index)입니다.

이번 글에서는 데이터베이스 인덱스가 무엇인지, 왜 필요한지, 언제 사용하면 좋지 않은지까지 자세히 설명하고, 초보자도 쉽게 이해할 수 있도록 예시를 통해 알아보겠습니다.


인덱스란 무엇인가?

인덱스를 이해하려면 먼저 책의 목차를 떠올려 보세요.

  • 책에서 원하는 내용을 찾으려면 처음부터 끝까지 읽어야 한다면 시간이 오래 걸리겠죠.
  • 하지만 목차가 있다면, 원하는 장이나 페이지로 바로 이동할 수 있습니다.

데이터베이스의 인덱스(Index)도 같은 역할을 합니다.

  • 테이블의 컬럼에 인덱스를 생성하면, DB는 해당 컬럼의 값을 빠르게 찾을 수 있는 별도의 자료 구조(보통 B-Tree나 Hash Table)를 만듭니다.
  • 즉, 인덱스를 사용하면 쿼리 속도가 획기적으로 빨라집니다.

예를 들어, 학생 테이블(Students)이 있다고 해봅시다.

CREATE TABLE Students (
    StudentID INT PRIMARY KEY,
    Name VARCHAR(50),
    Age INT,
    Major VARCHAR(50)
);

 

만약 Name 컬럼으로 검색을 자주 한다면, 인덱스를 만들 수 있습니다.

CREATE INDEX idx_name ON Students(Name);

 

이제 Name='민호'인 학생을 찾는 쿼리는 테이블 전체를 탐색(Full Table Scan) 하지 않고, 인덱스를 통해 바로 찾아갈 수 있습니다.


인덱스를 사용해야 하는 이유

검색 속도 향상

  • 가장 큰 장점입니다.
  • 예를 들어, 학생 테이블에 100만 건의 데이터가 있을 때, 전체를 일일이 검색하는 것은 매우 느립니다.
  • 하지만 이름 컬럼에 인덱스가 있으면 검색 시간이 수천 분의 1로 줄어들 수 있습니다.

정렬(ORDER BY)와 그룹화(GROUP BY) 속도 향상

  • 인덱스는 이미 정렬된 구조로 저장되기 때문에, 정렬이나 그룹화가 필요한 쿼리에서 속도를 크게 개선합니다.

JOIN 성능 개선

  • 테이블을 결합할 때, 인덱스를 사용하면 특정 키를 빠르게 찾아서 결합할 수 있습니다.

유일성(UNIQUE) 보장

  • 인덱스는 중복되지 않게 데이터를 관리할 수 있어, 유일 키 제약 조건을 구현할 때도 활용됩니다.

인덱스를 사용하면 안 되는 경우

하지만 인덱스는 무조건 좋은 것은 아닙니다. 상황에 따라 오히려 성능을 떨어뜨릴 수도 있습니다.


데이터 삽입/수정/삭제가 잦을 때

  • 인덱스가 있으면 새로운 데이터를 추가하거나 기존 데이터를 수정할 때, 인덱스도 함께 갱신해야 합니다.
  • 이 과정이 추가 작업을 만들어 쓰기 성능을 저하시킬 수 있습니다.

작은 테이블

  • 데이터가 몇 백 건 정도라면, 테이블 전체를 훑는 것이 더 빠른 경우가 많습니다.
  • 인덱스를 만들면 오히려 공간을 차지하고 관리 비용만 생깁니다.

자주 변하는 컬럼

  • 예를 들어 로그 테이블에서 LastAccessTime 같은 컬럼은 자주 갱신됩니다.
  • 이 컬럼에 인덱스를 걸면 갱신 시마다 인덱스도 바뀌므로 오버헤드가 발생합니다.

범위 검색이 잦은 컬럼

  • 인덱스는 특정 값을 빠르게 찾는 데 최적화되어 있습니다.
  • 하지만 BETWEEN이나 LIKE '%검색어%' 같이 범위나 앞부분이 아닌 부분 검색은 인덱스를 활용하기 어렵습니다.

인덱스 구조 간단히 이해하기

인덱스는 보통 B-Tree나 Hash Table 구조로 구현됩니다.

B-Tree 인덱스

  • 정렬된 트리 구조를 사용합니다.
  • 범위 검색, 정렬, 그룹화에 강점이 있습니다.

Hash 인덱스

  • 해시 함수를 사용해 값의 위치를 바로 찾습니다.
  • 정확히 일치하는 검색에는 매우 빠르지만, 범위 검색에는 적합하지 않습니다.

초보자가 실무에서 주의할 점

모든 컬럼에 인덱스를 만들지 않는다

  • 인덱스는 공간과 갱신 비용을 요구하므로, 검색 빈도가 높은 컬럼만 선택합니다.


복합 인덱스 사용 시 순서를 고려

  • WHERE 조건이 여러 개일 때, 컬럼 순서에 따라 인덱스 효율이 달라집니다.


실제 쿼리 실행 계획(EXPLAIN)을 확인

  • MySQL, PostgreSQL 등 대부분 DBMS는 쿼리 실행 계획을 보여주는 기능이 있습니다.
  • 이를 통해 인덱스가 잘 활용되는지 확인할 수 있습니다.

결론

인덱스는 검색 속도를 향상시키는 강력한 도구입니다.
하지만 쓰기 성능 저하, 공간 사용, 업데이트 오버헤드 등의 단점도 있습니다.
따라서 검색 빈도가 높고 변경이 적은 컬럼에 주로 사용하고, 필요 없는 컬럼에는 만들지 않는 것이 좋습니다.
초보자라면 다음 규칙을 기억하세요.

 

  1. 자주 검색하는 컬럼에만 인덱스를 걸자.
  2. 모든 테이블에 무작정 인덱스를 만들지 말자.
  3. 실행 계획(EXPLAIN)을 통해 실제로 인덱스가 사용되는지 확인하자.
  4. 범위 검색, LIKE 검색 등 인덱스가 효율적이지 않은 경우도 있다는 것을 기억하자.

인덱스를 적절히 활용하면 데이터베이스 성능을 비약적으로 개선할 수 있습니다. 반대로 잘못 사용하면 오히려 시스템을 느리게 만들 수 있으니, 항상 신중하게 선택해야 합니다.

728x90
profile

blog.pisik.club

@pisik

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!