관리 메뉴

♠개발자의 작은 서재♠

인덱스의 역할과 사용 이유 본문

IT 면접 질문 총정리!!/데이터베이스

인덱스의 역할과 사용 이유

♠디지털 모험일지♠ 2024. 10. 29. 20:06

1. 인덱스의 역할

  • 검색 속도 향상: 인덱스는 특정 열의 데이터를 빠르게 찾을 수 있도록 도와줍니다. 예를 들어, user_id 열에 인덱스를 생성하면 user_id를 기준으로 데이터를 검색할 때 인덱스를 통해 빠르게 찾을 수 있습니다.
  • 데이터 정렬 도움: 인덱스는 데이터가 특정 순서로 정렬되어 저장된 것처럼 보이게 합니다. 이를 통해 정렬된 데이터를 더 빠르게 조회할 수 있습니다.
  • 중복 방지: 고유 인덱스(Unique Index)를 설정하면, 해당 열에 중복된 값이 들어가는 것을 방지할 수 있습니다. 예를 들어, email 열에 고유 인덱스를 걸면 동일한 이메일이 두 번 이상 입력되는 것을 막습니다.
  • 쉽게 설명: 인덱스는 책의 "목차"와 같아서, 필요한 페이지를 빨리 찾아갈 수 있게 해줍니다. 목차가 없으면 모든 페이지를 일일이 넘겨야 하지만, 목차가 있으면 바로 찾을 수 있죠.

2. 인덱스의 사용 이유

  • 빠른 조회: 인덱스는 데이터를 찾을 때 일일이 모든 행을 읽는 대신, 인덱스를 통해 빠르게 접근할 수 있습니다. 대량의 데이터를 다루는 시스템에서 조회 속도를 크게 향상시킵니다.
  • 정렬 작업 최적화: 인덱스를 사용하면 특정 열에 대한 정렬 작업이 더 빠르게 수행됩니다. 인덱스를 사용하지 않으면 테이블의 모든 데이터를 정렬해야 해서 속도가 느려질 수 있습니다.
  • JOIN 및 GROUP BY 최적화: 여러 테이블을 결합하거나 데이터 그룹화할 때 인덱스를 통해 빠르게 데이터를 검색하여 작업 성능을 높일 수 있습니다.
  • 쉽게 설명: 인덱스를 사용하면 데이터가 많아도 특정 데이터를 찾는 속도가 매우 빨라집니다. 예를 들어, 전화번호부에서 이름을 찾는 경우 이름이 가나다 순으로 정렬되어 있다면 더 빨리 찾을 수 있는 것과 비슷합니다.

3. 인덱스 예시 코드

  • 기본 인덱스 생성: 특정 열에 인덱스를 설정하는 기본 예시입니다.

    CREATE INDEX idx_user_name ON users (name);

이 코드는 users 테이블의 name 열에 인덱스를 생성하는 예입니다. 이제 name을 기준으로 데이터를 검색할 때 더 빠르게 찾을 수 있습니다.

  • 고유 인덱스 생성: 중복된 데이터를 방지할 수 있는 인덱스입니다.

    CREATE UNIQUE INDEX idx_user_email ON users (email);

    이 코드는 users 테이블의 email 열에 고유 인덱스를 생성하는 예입니다. 동일한 이메일 주소가 두 번 들어가는 것을 방지할 수 있습니다.

  • 복합 인덱스 생성: 두 개 이상의 열에 인덱스를 설정하여 복합 조건 검색을 최적화하는 방법입니다.

    CREATE INDEX idx_user_name_age ON users (name, age);

    이 코드는 users 테이블에서 nameage 두 열을 함께 인덱스로 설정합니다. nameage를 모두 조건으로 하는 검색을 더 빠르게 할 수 있습니다.


4. 인덱스의 장단점

  • 장점:
    • 검색 속도 향상: 인덱스를 통해 데이터를 더 빠르게 찾을 수 있어 성능이 향상됩니다.
    • 정렬 및 그룹화 최적화: 데이터 정렬이나 GROUP BY와 같은 쿼리에서 성능을 높여줍니다.
    • 데이터 일관성 보장: 고유 인덱스를 통해 특정 열의 중복 입력을 방지할 수 있습니다.
  • 단점:
    • 추가적인 저장 공간 필요: 인덱스는 테이블 외에 별도의 저장 공간을 차지합니다.
    • 데이터 삽입 및 수정 시 성능 저하: 인덱스가 있는 열에 데이터를 추가하거나 수정할 때, 인덱스도 함께 갱신해야 하므로 성능이 떨어질 수 있습니다.
    • 과도한 인덱스 사용: 너무 많은 인덱스를 생성하면 오히려 성능을 떨어뜨릴 수 있으므로, 필요한 열에만 신중하게 인덱스를 설정해야 합니다.

5. 인덱스가 없는 경우와 비교

  • 인덱스가 없는 경우: 모든 행을 처음부터 끝까지 읽는 풀 스캔을 해야 합니다. 데이터가 많아질수록 검색 시간이 길어집니다.

  • 인덱스가 있는 경우: 인덱스를 사용해 필요한 데이터가 있는 위치를 바로 찾아가므로 검색 속도가 빨라집니다.

  • 예시 코드 비교:

    -- 인덱스 없이 검색
    SELECT * FROM users WHERE name = 'Alice';
    
    -- 인덱스가 있을 때 검색
    CREATE INDEX idx_user_name ON users (name);
    SELECT * FROM users WHERE name = 'Alice';

첫 번째 쿼리는 인덱스가 없을 때 모든 행을 검색하는 경우이고, 두 번째 쿼리는 name 열에 인덱스를 생성한 후 Alice라는 이름을 가진 사용자를 빠르게 찾는 예입니다. 인덱스가 있는 경우 데이터베이스는 바로 해당 위치를 찾아가기 때문에 훨씬 빠르게 결과를 반환합니다.


6. 인덱스를 사용하는 최적의 상황

  • 자주 검색되는 열: 인덱스를 생성하면 검색이 자주 이루어지는 열에서 성능을 향상시킬 수 있습니다.
  • 정렬 또는 그룹화가 자주 발생하는 열: ORDER BY, GROUP BY와 같은 쿼리에서 정렬 및 그룹화가 필요한 열에 인덱스를 설정하면 효율적입니다.
  • JOIN이 자주 발생하는 열: 여러 테이블을 결합할 때 인덱스가 있으면 더 빠르게 조인을 수행할 수 있습니다.

인덱스는 데이터베이스에서 빠른 검색을 가능하게 하는 중요한 역할을 하지만, 잘못 사용하면 성능에 악영향을 미칠 수 있습니다. 데이터베이스 설계 시 쿼리 빈도와 데이터 양을 고려하여 인덱스를 효율적으로 사용하는 것이 중요합니다.

Comments