독서/전공서적(dev)

RDB 성능 높이는 법, 데이터베이스 튜닝 (feat. 비정규화 전에 고려할 것)

lowellSunny 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) 시스템을 사용하여 정기적으로 값을 검증하는 방법