유튜브 채널 쉬운코드의 강의 영상으로 공부하면서 작성한 게시글입니다.


Partitioning

  • db 테이블을 더 작은 테이블들로 나누는 것
  • Partitioning - column 기준으로 테이블 나누는 방식
  • horizontal partitioning - row를 기준으로 테이블 나누는 방식
  • 정규화도 일종의 버티컬 파티셔닝

article이라는 테이블이 있다고 하자.

id title writer_id created_at content
1 제목 1 dodontak 16:06:05 어쩌구 저쩌구...
2 제목2 kim 15:51:09 어쩌구 저쩌구...
... ... ... ... ...

인터넷 게시판 글들을 생각해보면 [제목 작성자 작성일 조회수] 이렇게 게시글 목록이 있고 그중에 하나를 누르면 내용을 보는 식으로 되어있다.

SELECT id, title, created_at, read_cnt FROM article;

그런데 우리가 이렇게 쿼리를 쓴다 해도 article 테이블에 content라는 본문내용이 적혀있다면 db는 글목록을 채우는데 필요없는 본문까지 ssd/hdd에서 읽어온다. content는 사이즈가 클것이므로 이것까지 다 읽어오는건 io에 부담이 생긴다.

이런 문제를 버티컬 파티셔닝으로 해결할 수 있다.

vertical partitioning

id content
1 어쩌구 저쩌구
2 어쩌구 저쩌구
... ...

이렇게 article_content 테이블을 만들어 이미 정규화가 되어있는 테이블이어도 퍼포먼스를 위해 버티컬 파티셔닝을 하는 것.

다른 이유로도 사용되는데 민감한 정보에 제한을 더 걸어서 숨기는데 사용하거나 자주 사용하는 정보를 모아두는데에도 쓰일 수 있다.

horizontal partitioning

컬럼은 그대로 두고 row를 기준으로 나누는 파티셔닝

테이블의 크기가 커질수록 인덱스의 크기도 커진다. 때문에 읽기/쓰기 있을때마다 인덱스에서 처리되는 시간도 조금씩 늘어난다.

이 때 사용하는 방법이 호리존탈 파티셔닝 (hash기반)

캐릭터 테이블이 있다고 하자

user_id character_id is_active last_login
aaaa 1 1 ...
yeah 203 0 ...
sonny 395 1 ...
mango 717 1 ...
... ... ... ...

먼저 user_id를 인풋으로 받아 0 1을 아웃풋 하는 해시 함수를 준비한다.

유저 id를 해시 함수에 넣어서 0이 나오면 테이블0으로 1이 나오면 테이블 1에 데이터를 저장해서 한 테이블에 있던 데이터를 두개의 테이블로 나눠서 저장한다. 상황에따라 더 많은 테이블로 나눌수도 있다. 이 때 user_id를 파티션 키 라고 한다.

 

만약 where절에 user_id 조건으로 select한다면 해당 유저 id는 무조건 특정 테이블에 모여있기 때문에 빠르게 찾아낼 수 있다.

하지만 파티션 키가 아닌 컬럼을 조건으로 찾아야한다면 모든 테이블을 다 찾아봐야 할 것이다. 그래서 가장 많이 사용될 패턴에 따라 파티션 키를 정하는 것이 중요하다. 또한 데이터가 균등하게 분배될 수 있도록 해시함수를 잘 정의하는것도 중요하다.

 

호리존탈 파티셔닝은 한번 파티션이 나뉘어져서 사용되면 이후에 파티션을 추가하기 까다롭다. 그래서 처음 파티셔닝을 잘해야한다.

해시기반 외에도 범위기반도 있고 여러가지 방법이 있다. 이건 알아서 공부하란다.


Sharding

호리존탈 파티셔닝처럼 row를 기준으로 테이블을 나눈다.

다른 점은 각 파티션이 독립된 db에 저장된다는 것. 호리존탈 파티셔닝은 모든 파티션들이 같은 DB서버에 저장된다.

파티션을 서로다른 db에 저장하면 요청이 밀려올 때 트래픽이 여러 db 로 분산되기 때문에 db서버의 부하를 줄일 수 있다.

샤딩에서는 파티션키 = 샤드 키, 파티션 = 샤드 라고 부른다.

 


Replication

만약 메인 db 서버가 맛이 가면 언제든지 쓸 수 있는 보조 db 서버를 준비하는 것.

주 db 서버가 있고, 그 내용을 실시간으로 똑같이 복사해 갖고있는 보조서버를 준비한다.

그리고 만약 주 db 서버에 read/write를 하고있었는데 db서버에 문제가 생기면 빠르게 보조서버에 read/write할 수 있도록 처리한다.

이런 처리를 fail over라 하고, 빠르게 fail over를 함으로써 서비스가 정상적으로 유지될 수 있도록 하는걸 High Availability(HA) 고가용성 이라고 한다.

대부분의 서비스는 read 가 많고 write는 적다. 그래서 주 db로 몰리는 read 쿼리의 일부를 보조서버로 돌려서 부하를 분산시킬 수 있다.

  • 주 db 서버를 master/primary/leader 라고 부른다
  • 보조 서버를 slave/secondary/replica 라고 부른다
  • 보조서버는 한대만이 아니라 여러대 있을수도 있다

RDBMS에서의 지원 여부

postgresql에서는 horizontal partitioning과 Replication 기능을 제공한다.

단 파티셔닝의 설계는 사용자의 몫이고, Replication은 서버를 2대 이상 띄우고 네트워크 설정을 해야한다고 한다.

샤딩은 RDBMS에서 지원하지 않고, 애플리케이션 레벨에서 사용자가 관리한다.


postgresql 파티셔닝 관련 유용할 것 같은 글

https://postgresql.kr/blog/postgresql_partition_table_2.html

 

PostgreSQL 파티션 테이블 2부

선언적 파티션 테이블 관련 이야기

postgresql.kr

 

'공부 > DB' 카테고리의 다른 글

postgresql libpq C/C++  (0) 2026.03.04
DBCP (DB connection pool)  (0) 2026.02.19
postgreSQL EXPLAIN ANALYZE  (0) 2026.02.18
postgreSQL MVCC  (0) 2026.02.18
DB LOCK  (0) 2026.02.18

+ Recent posts