DB 사용 최적화 (인덱싱, 샤딩)

CosmoNumb·2024년 8월 19일

DB

목록 보기
3/8

1. 데이터베이스 인덱싱 (Indexing)

개념

데이터베이스 인덱싱은 데이터베이스 테이블에서 데이터를 빠르게 검색하기 위해 사용되는 기술입니다. 인덱스는 책의 목차와 비슷한 역할을 하며, 데이터베이스 내의 특정 열(Column)에 대한 검색 속도를 향상시키기 위해 사용됩니다.

인덱스는 테이블의 한 열이나 여러 열에 대해 추가적인 데이터 구조(B-Tree, Hash 등)를 생성하며, 이 구조는 데이터가 저장된 위치에 대한 포인터 역할을 합니다. 인덱스가 있으면 검색 시 테이블의 모든 데이터를 탐색하는 대신, 인덱스를 통해 빠르게 원하는 데이터를 찾을 수 있습니다.

중요 개념

  • 클러스터드 인덱스(Clustered Index):

    • 테이블의 실제 데이터가 인덱스 순서에 따라 정렬됩니다. 하나의 테이블에는 하나의 클러스터드 인덱스만 존재할 수 있습니다.
    • 클러스터드 인덱스의 키 값에 따라 테이블의 행 데이터가 물리적으로 정렬됩니다.
  • 넌클러스터드 인덱스(Non-Clustered Index):

    • 인덱스는 별도의 데이터 구조로 저장되며, 실제 데이터는 원래 테이블에 그대로 남아있습니다. 여러 개의 넌클러스터드 인덱스를 가질 수 있습니다.
    • 인덱스가 실제 데이터에 대한 포인터를 포함하여, 테이블의 데이터 검색 속도를 향상시킵니다.
  • 인덱스의 장점:

    • 검색 속도 향상: 특정 열에 대해 검색할 때 테이블의 전체 데이터를 스캔하지 않아도 됩니다.
    • 성능 최적화: WHERE, JOIN, ORDER BY 등의 연산에서 성능을 향상시킵니다.
  • 인덱스의 단점:

    • 쓰기 성능 저하: 데이터를 삽입, 수정, 삭제할 때마다 인덱스를 갱신해야 하므로, 쓰기 성능이 떨어질 수 있습니다.
    • 공간 차지: 인덱스를 저장하기 위한 추가적인 디스크 공간이 필요합니다.

예시

  1. 단일 열 인덱스:

    CREATE INDEX idx_employee_lastname ON employees(last_name);
    • 이 인덱스는 employees 테이블의 last_name 열에 대한 인덱스를 생성하여, last_name을 기준으로 하는 검색을 빠르게 합니다.
  2. 다중 열 인덱스 (Composite Index):

    CREATE INDEX idx_employee_name ON employees(last_name, first_name);
    • 이 인덱스는 last_namefirst_name을 조합하여 인덱스를 생성하며, 두 열을 동시에 사용하는 검색을 최적화합니다.

2. 데이터베이스 샤딩 (Sharding)

개념

데이터베이스 샤딩은 데이터베이스를 여러 개의 작은 단위(샤드, Shard)로 나누어 저장하는 기술입니다. 샤딩은 특히 대규모 데이터베이스 시스템에서 데이터 처리 성능을 향상시키고, 확장성을 제공하기 위해 사용됩니다. 각 샤드는 동일한 스키마를 가지지만, 서로 다른 데이터를 저장합니다.

샤딩의 목적은 데이터를 물리적으로 분할하여 한 서버에 과도한 부하가 걸리지 않도록 하고, 데이터베이스 시스템의 성능과 확장성을 개선하는 것입니다.

중요 개념

  • 수평 샤딩 (Horizontal Sharding):

    • 테이블의 행을 기준으로 데이터를 나누어 여러 데이터베이스에 분산합니다. 예를 들어, 고객 데이터를 고객 ID를 기준으로 나누어 여러 샤드에 저장할 수 있습니다.
    • 각 샤드는 동일한 스키마를 가지지만, 데이터는 서로 다릅니다.
  • 수직 샤딩 (Vertical Sharding):

    • 테이블의 열을 기준으로 데이터를 나누어 샤드에 분산합니다. 예를 들어, 고객 정보는 한 샤드에, 주문 정보는 다른 샤드에 저장할 수 있습니다.
  • 샤드 키 (Shard Key):

    • 데이터를 샤드에 분배하기 위해 사용되는 키입니다. 샤드 키는 일반적으로 하나 이상의 열로 구성되며, 이 키에 따라 데이터가 어느 샤드에 저장될지 결정됩니다.
  • 샤딩의 장점:

    • 확장성: 데이터가 분산되어 처리되므로, 시스템의 확장성이 높아집니다.
    • 성능 향상: 각 샤드에서 데이터가 분산 처리되므로, 읽기/쓰기 성능이 개선됩니다.
  • 샤딩의 단점:

    • 복잡성: 샤드 간의 데이터 일관성 유지, 쿼리 복잡성 증가 등의 문제가 발생할 수 있습니다.
    • 관리 오버헤드: 샤드의 추가/삭제, 데이터의 재분배 등의 작업이 복잡합니다.

예시

  1. 수평 샤딩:

    • 고객 데이터베이스를 고객 ID를 기준으로 두 개의 샤드로 나눈다고 가정합니다.
    • 고객 ID가 1~1000인 데이터를 shard1에 저장하고, 1001~2000인 데이터를 shard2에 저장합니다.
    -- shard1: 고객 ID 1~1000
    INSERT INTO shard1.customers (customer_id, name) VALUES (1, 'John Doe');
    
    -- shard2: 고객 ID 1001~2000
    INSERT INTO shard2.customers (customer_id, name) VALUES (1001, 'Jane Doe');
  2. 수직 샤딩:

    • 고객 정보와 주문 정보를 각각의 샤드로 분리하여 저장합니다.
    -- shard1: 고객 정보
    CREATE TABLE shard1.customers (
        customer_id INT PRIMARY KEY,
        name VARCHAR(100),
        email VARCHAR(100)
    );
    
    -- shard2: 주문 정보
    CREATE TABLE shard2.orders (
        order_id INT PRIMARY KEY,
        customer_id INT,
        order_date DATE
    );

3. 결론

  • 데이터베이스 인덱싱은 데이터 검색 성능을 최적화하는 중요한 기술로, 적절한 인덱스 설계는 데이터베이스의 성능을 크게 향상시킬 수 있습니다.
  • 데이터베이스 샤딩은 대규모 데이터베이스 시스템에서 성능과 확장성을 제공하기 위한 방법으로, 데이터를 여러 샤드로 분산하여 처리 부담을 줄이고, 시스템 확장성을 높입니다.

이 두 가지 개념은 대규모 시스템 설계에서 중요한 역할을 하며, 적절한 설계와 구현은 시스템의 성능과 유지보수성을 크게 향상시킬 수 있습니다.

0개의 댓글