ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • RDB 성능 높이는 법, 데이터베이스 튜닝 (feat. 비정규화 전에 고려할 것)
    독서/전공서적(dev) 2024. 12. 5. 12:57

    <김기창의 데이터 모델링 강의> 책을 읽으며 추가 검색 하여 정리하였습니다.

     

    성능문제 발생 시, 비정규화 하기 전에 다른 방법으로 해결할 수 있나 확인하는 것이 먼저다.

    첫째, 파티션. 둘째, 클러스터링. 셋째 IOT 에 대해 설명한다.

     

    1. 파티션

    > 데이터를 효율적으로 관리하고 쿼리 성능을 향상시키기 위해 테이블이나 인덱스를 여러 파티션으로 나누는 기능

    > DBMS가 파티션별로 병렬 처리를 수행 가능

    > 파티션별로 저장소(Storage), 압축, 인덱스를 개별적으로 설정 가능.

    > 참고로, 실무에서 사용 경험이 별로 없었는데, 그 이유는 보통 쿼리 성능이슈 발생 시 튜닝 업무를 하는데, 보통 작업환경은 MySQL이었다. MySQL 에서는 기존 테이블에 파티션을 추가할 수 없으므로 새로운 파티션 테이블로 데이터를 이관해야하기 때문이었다.

     

    * 파티션 유형 별 데이터를 나누는 기준

     

    • Range Partitioning: 특정 범위 기준. 예: 날짜 범위, ID 범위
    • List Partitioning: 특정 값 목록 기준. 예: 지역 코드, 카테고리
    • Hash Partitioning: 데이터 해시값 기준. 균등 분배에 적합
    • Composite Partitioning: Range와 List 또는 Hash를 조합하여 사용.

     

    /* 조회 주문을 연도별로 쪼갠다. */
    /* DDL */
    CREATE TABLE orders (
        order_id INT NOT NULL,
        order_date DATE NOT NULL,
        customer_id INT,
        amount DECIMAL(10,2),
        PRIMARY KEY (order_id, order_date)
    )
    PARTITION BY RANGE (YEAR(order_date)) (
        PARTITION p2020 VALUES LESS THAN (2021),
        PARTITION p2021 VALUES LESS THAN (2022),
        PARTITION p2022 VALUES LESS THAN (2023)
    );
    
    /* 파티션 조회 */
    EXPLAIN PARTITIONS
    SELECT * FROM orders WHERE order_date = '2021-05-01';

     

    2. 데이터베이스 클러스터링

    > 개념: 여러 노드를 하나의 시스템처럼 동작하게 묶는 것. 시스템을 확장하고 안정성을 높이는 방법론이나 아키텍처 설계 패턴.

    > 대부분의 DBMS에서 기본적으로 제공하거나 플러그인 형태로 지원하는 기능

    > 데이터베이스 클러스터 (예: MySQL Cluster, PostgreSQL Cluster)

    > 분산 저장소 (예: Elasticsearch, Hadoop HDFS)

    > 클러스터링 알고리즘: K-means, DBSCAN, Mean Shift, Spectral Clustering

     

     

    1. Replica 기반 클러스터링
      • 데이터를 복제하여 여러 노드에 동일한 데이터를 유지.
      • 장애 발생 시 복제본이 역할을 대신함.
      • 예: MySQL Master-Slave, PostgreSQL Streaming Replication.
    2. Sharding 기반 클러스터링
      • 데이터를 여러 노드에 분산하여 저장(샤딩).
      • 각 노드는 일부 데이터만 관리하며 전체 데이터를 나누어 처리.
      • 예: MongoDB, Cassandra.
    3. 하이브리드 방식
      • 샤딩과 복제를 함께 사용하여 데이터를 분산하고 복제.
      • 예: MongoDB Replica Set + Sharding, Elasticsearch.

     

     

    3. IOT (Index-Organized Table)

    > IOT는 주로 Oracle Database에서 제공하는 기능으로, MySQL이나 PostgreSQL 같은 다른 DBMS에서는 동일한 개념을 다른 방식으로 구현하거나 지원하지 않을 수 있음.

    > 단점: DML 작업이 많은 환경에서는 성능 저하를 초래할 수 있으므로, 읽기 위주의 환경에서 사용하는 것이 적합.

    > 적용 사례

     

    • 읽기 위주의 트랜잭션 처리: 기본 키로 자주 데이터를 검색하거나 정렬된 데이터를 사용하는 경우.
    • 범위 검색: 기본 키 또는 기본 키의 일부를 기준으로 한 범위 쿼리(예: 날짜 범위).
    • 공간 절약이 중요한 경우: 저장 공간 효율이 중요한 시스템에서 효과적.

    > 데이터가 인덱스 내부에 포함되어 있기 때문에 테이블과 인덱스가 하나의 구조로 통합됩니다.

     

    > 예시

     

    CREATE TABLE orders (
        order_id NUMBER PRIMARY KEY,
        customer_id NUMBER,
        order_date DATE,
        total_amount NUMBER
    ) ORGANIZATION INDEX;

     

     

     

     

    상황을 특성을 고려했을 때 적합한 방법이 떠오르지 않으면 최후의 수단으로 비정규화를 사용합니다.

     

    비정규화 시  고려할 것

    1. 데이터 정합성 구현

    2. 원천 데이터 어디인지 명확하게 정의하기

     

    > DQ(Data Quality) 시스템을 사용하여 정기적으로 값을 검증하는 방법

     

Designed by Tistory.