Internal Schema는 데이터가 실제 물리적으로 저장되는 방식을 정의하는 것이므로, SQL 쿼리보다는 데이터베이스 내부의 저장 구조를 최적화하는 설정 코드로 표현됩니다.
아래 예제에서는 MySQL, PostgreSQL, MongoDB 등에서 Internal Schema를 구현하는 방법을 보여드릴게요.
1️⃣ MySQL에서 Internal Schema 적용 예시
MySQL에서는 스토리지 엔진, 인덱스 구조, 파티셔닝을 설정하여 Internal Schema를 구성할 수 있습니다.
✅ B-Tree 인덱스 적용 (클러스터링 인덱스)
sql
복사편집
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
name VARCHAR(100), address VARCHAR(255),
balance DECIMAL(10, 2),
INDEX (balance) -- balance 필드에 인덱스 적용 )
ENGINE = InnoDB;
🔹 Internal Schema 적용 요소:
- InnoDB 엔진 사용 → B-트리 기반 인덱스 적용
- customer_id는 클러스터링 인덱스 적용
- balance 컬럼에 보조 인덱스(Secondary Index) 적용
✅ 해싱 인덱스 적용 (MEMORY 엔진)
sql
복사편집
CREATE TABLE SessionData (
session_id VARCHAR(50) PRIMARY KEY,
user_id INT NOT NULL,
last_access TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX USING HASH (user_id) -- Hash 인덱스 적용 )
ENGINE = MEMORY;
🔹 Internal Schema 적용 요소:
- MEMORY 엔진 사용 → 데이터를 RAM에 저장하여 빠른 조회 가능
- user_id에 해싱 인덱스(Hash Index) 적용 → 빠른 검색
✅ 파티셔닝 적용 (대용량 데이터 최적화)
CREATE TABLE Orders (
order_id INT NOT NULL,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(10, 2),
PRIMARY KEY (order_id, order_date)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p1 VALUES LESS THAN (2022),
PARTITION p2 VALUES LESS THAN (2023),
PARTITION p3 VALUES LESS THAN (2024)
);
order_id INT NOT NULL,
customer_id INT NOT NULL,
order_date DATE NOT NULL,
amount DECIMAL(10, 2),
PRIMARY KEY (order_id, order_date)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p1 VALUES LESS THAN (2022),
PARTITION p2 VALUES LESS THAN (2023),
PARTITION p3 VALUES LESS THAN (2024)
);
🔹 Internal Schema 적용 요소:
- order_date 기준으로 연도별 파티셔닝(RANGE PARTITION)
- 데이터를 연도별로 나누어 저장하여 검색 속도 최적화
2️⃣ PostgreSQL에서 Internal Schema 적용 예시
✅ 인덱스 최적화 (GIN 인덱스)
CREATE TABLE Documents (
id SERIAL PRIMARY KEY,
content TEXT
);
-- GIN(Generalized Inverted Index) 인덱스 적용
CREATE INDEX content_idx ON Documents USING GIN (to_tsvector('english', content));
id SERIAL PRIMARY KEY,
content TEXT
);
-- GIN(Generalized Inverted Index) 인덱스 적용
CREATE INDEX content_idx ON Documents USING GIN (to_tsvector('english', content));
🔹 Internal Schema 적용 요소:
- to_tsvector()를 사용하여 텍스트 검색 최적화
- GIN(Generalized Inverted Index) 인덱스 적용 → 텍스트 검색 속도 향상
✅ 테이블 파티셔닝 (PostgreSQL 10+)
CREATE TABLE Sales (
id SERIAL PRIMARY KEY,
sale_date DATE NOT NULL,
amount DECIMAL(10,2)
) PARTITION BY RANGE (sale_date);
CREATE TABLE Sales_2022 PARTITION OF Sales
FOR VALUES FROM ('2022-01-01') TO ('2022-12-31');
id SERIAL PRIMARY KEY,
sale_date DATE NOT NULL,
amount DECIMAL(10,2)
) PARTITION BY RANGE (sale_date);
CREATE TABLE Sales_2022 PARTITION OF Sales
FOR VALUES FROM ('2022-01-01') TO ('2022-12-31');
🔹 Internal Schema 적용 요소:
- sale_date 기준으로 RANGE 파티셔닝 적용
- 2022년 데이터는 Sales_2022 테이블에 물리적으로 저장됨
결론: Internal Schema 설정 코드란?
Internal Schema 설정 코드란, 데이터가 물리적으로 저장되는 방식을 최적화하는 코드입니다.
💡 Internal Schema에 해당하는 코드 요소:
- 스토리지 엔진 선택 (ENGINE = InnoDB, ENGINE = MEMORY)
- 인덱스 설정 (USING HASH, USING GIN, CREATE INDEX)
- 파티셔닝 적용 (PARTITION BY RANGE, PARTITION OF Sales)
- 샤딩 적용 (sh.enableSharding(), sh.shardCollection())
즉, 위 예제에서 단순한 SQL 테이블 생성이 아니라 "데이터의 저장 구조를 결정하는 설정" 부분이 Internal Schema 설정 코드에 해당합니다.
Internal Schema의 특징
- 물리적 데이터 저장 방식 정의
- 데이터를 어떤 파일 구조로 저장할 것인지 결정합니다.
- 예: B-트리 인덱스를 사용할지, 해싱(Hashing)을 사용할지 결정
- 저장 공간 최적화
- 디스크 공간을 효율적으로 사용하기 위해 데이터 압축이나 블록 크기를 조절합니다.
- 예: 컬럼형 저장 방식(Column-Oriented Storage)과 행 기반 저장 방식(Row-Oriented Storage) 결정
- 성능 최적화
- 빠른 검색과 처리를 위해 인덱스를 생성하거나 클러스터링을 적용할 수 있습니다.
- 예: 자주 조회되는 데이터에 클러스터링 인덱스를 적용하여 조회 속도 향상
'CS 과목(CS科目) > 데이터 베이스(データベース)' 카테고리의 다른 글
database 기본 개념(Feat. data models, conceptual level, logical level, physical level, three schema architecture etc) (0) | 2025.01.31 |
---|---|
Inner Join과 Cross Join(세타 Join)의 차이 (0) | 2023.04.22 |
페이징(Paging) (0) | 2023.04.21 |
DB 설계 시, 多 관계에 있는 Table에 FK가 있어야 하는 이유 (0) | 2023.04.12 |
Associational Relation의 주인(Owner)에 대해 확실히 이해하자! (2) | 2023.04.12 |