주제
데이터베이스란 무엇인가?
동기
데이터베이스가 무엇인지는 알고 어떻게 사용하는지, 어떤 상황에서 어떤걸 쓰는게 좋은지는 안다.
하지만 데이터베이스가 탄생한 배경에 대해서 궁금해졌다.(최근에 웹의 탄생 배경에 대한 유튜브를 보고)
파일 시스템에서 출발한건 알지만 어떤 문제가 있어서 이렇게 된건지. 이런것들을 좀 찾아서 공부해보자.
알게된 내용
1. 데이터베이스의 역사
[ 파일 시스템, 초기 데이터베이스 ]
초기 데이터베이스는 단순한 파일 시스템을 사용했다. 데이터는 파일로 저장되고, 프로그램은 직접 파일을 읽고 데이터를 관리했다.
이 방식은 관리가 어렵고 데이터 접근성이 낮았다.
첫번쨰로 데이터 중복과 일관성 문제가 있다.
같은 데이터가 여러 파일에 중복 저장되어 공간 낭비로 이어졌고 중복 저장되기 때문에 한 파일의 데이터를 수정해도 다른 파일의 동일한 데이터는 업데이트 되지않아 데이터 불일치가 발생한다.
두번째로 데이터 검색이 느리다는 문제가 있다.
특정 조건에 맞는 데이터를 찾으려면 파일 전체를 순차적으로 읽어야 한다.
쉽게 말해서 텍스트 파일 안에 있는 특정 정보를 찾으려면 파일을 처음부터 끝까지 순서대로 읽어야 한다는 문제가 있다.
이는 인덱스나 빠른 검색 방법이 없기 때문이다.
[ 관계형(Relational) 데이터베이스 ]
파일 시스템의 단점으로 인해 여러가지 데이터베이스의 필요성을 느껴 많은 디비가 탄생했다.
계층형, 네트워크형, 관계형과 같은 데이터베이스의 원론적인 분류가 있지만 이 세가지 유형의 데이터베이스의 선택은 관계형 데이터베이스, 즉, rdbms로 결론이 났다고 볼 수 있다. 현재도 많은 rdbms가 상용 디비로 사용되고 있기 때문이다.
[ NoSQL ]
2000년대에는 데이터의 총량이 너무 커짐에 따라 빅데이터를 어떻게 처리할 것인가에 대한 관심이 커졌다.
이 대량의 데이터를 처리하기 위한 새로운 요구사항이 생겼다.
이에 NoSQL 데이터베이스가 나오면서 RDBMS의 지배력에 도전장을 내밀었다. 특히 SNS와 같은 데이터를 저장하기에 적합한 저장소로 각광받았다. 대규모 확장성과 유연성이 필요한 시나리오에서 유리했기 때문이다.


2. RDBMS의 종류와 특징
오늘 개발일기의 주제는 데이터베이스지만 가장 궁금했던 것은 RDBMS의 여러 종류들을 어떤 필요에 의해 선택하고 어느 것이 어떤 상황에 더 좋을지였다.
1. Oracle
오라클은 1970년대에 개발되었고 오픈소스 데이터베이스가 개발되기 전에 많이 사용된 RDBMS이다.
현재까지도 많이 쓰고 있고 기업 환경에서 많이 쓰는데 그 이유가 무엇일까?
첫번째로 Oracle RAC를 통해서 대규모 데이터를 처리할때 장점을 가지고 있다.
RAC(Real Application Clusters)는 서버들이 하나의 네트워크로 구성되어 대규모 트래픽, 데이터를 더 빠르고 안전하게 처리할 수 있게 한다. 하지만 문제가 있는데 모든 노드(서버)에서 전체 데이터에 접근이 가능해야하므로 데이터 동기화 문제가 있다. 또한 이걸 구성하기 위한 서버 스펙 때문에 비용이 비싸지고 설정이 다른 RDBMS보다 비싸다.
두번째로 다양한 데이터 유형을 지원한다.
RDBMS에서 ORDBMS로 진화해 단순한 관계형 데이터 외에도 json, xml, 공간, 그래프데이터 등 비정형 데이터까지 처리 가능하다.
요약: Oracle은 RAC를 지원하기 때문에 안정성, 보안, 대용량 데이터를 빠르고 안전하게 처리할 수 있다. 하지만 고가용성을 구성하는만큼 비용이 더 많이 들어가는 단점이 있다.
2. PostgreSQL
PostgreSQL은 1986년에 개발된 오픈소스 RDBMS이다. 학술적 연구 기반으로 탄생했기 때문에 복잡한 쿼리 분석을 중점으로 개발되었다. 따라서 옵티마이저가 더 정교하고 윈도우함수, CTE, 복잡한 집계 함수들이 더 강력해 복잡한 쿼리와 대규모 서비스(대량 조인이나 많은 데이터셋)에서 강점을 보인다.
PostgreSQL의 특징을 알아보자.
첫번째로 멀티 스레드 방식의 MySQL과 달리 멀티 프로세스 방식을 지원한다.
이는 한 클라이언트 연결마다 독립된 프로세스를 생성해 처리한다는 의미이고 한 연결에서 문제가 생겨도 다른 연결에 영향을 주지 않아 안정성 면에서 좋다는 장점이 있다.
두번째로 Oracle과 비슷하게 다양한 데이터 유형을 지원한다.
PostgreSQL 또한 ORDBMS로 관계형 데이터 외에도 json, jsonb 등 비정형 데이터까지 처리 가능하다.
하지만 복잡한 쿼리와 대규모 서비스에 특화된 대신, 단순 CRUD 성능은 MySQL보다 떨어진다. 특히 UPDATE에 취약하다.
MVCC 방식을 사용해 UPDATE시 기존 행을 수정하는게 아니라 새로운 버전의 행을 생성한다. 기존 행은 삭제되지 않고 무효화 표시만 되며, 나중에 VACUUM 프로세스가 정리한다. 이 방식은 동시성을 높이지만 UPDATE가 빈번한 경우 디스크 공간 사용량이 증가하고 VACUUM 오버헤드가 발생해 성능에 영향을 줄 수 있다.
요약: PostgreSQL은 다른 DBMS보다 더 정교한 윈도우함수, CTE, 집계함수, 옵티마이저 등을 지원한다. 따라서 복잡한 쿼리 분석, 대용량 데이터 처리에 강점이 있다. 하지만 기본적인 CRUD 특히나 UPDATE에서는 성능 단점이 있다.
3. MySQL
MySQL은 1995년에 개발된 오픈소스 RDBMS이다.
웹개발에서 압도적으로 많이 사용되는데 그 이유는 웹 애플리케이션의 특성과 MySQL의 설계 철학이 잘 맞기 떄문이다.
웹 애플리케이션은 대부분 읽기 요청이 쓰기 요청보다 많다. 즉, SELECT 쿼리가 주를 이룬다.
MySQL은 이런 읽기 작업에서 강점이 있기에 웹개발 쪽에서 많이 사용하는 데이터베이스이다.
그러면 MySQL이 읽기 작업에서 왜 강점을 나타낼까?
현재는 MySQL에서 가장 널리 사용되는 엔진이 InnoDB이기 때문에 InnoDB 기반으로 설명할 것이다.
MySQL(InnoDB)은 클러스터 인덱스(물리적으로 정렬되어 저장되는 인덱스) 위에 구성되어 있어서 빠르게 기본키 조회가 가능하다.
이는 PK 순서대로 디스크에 저장되어 Range 스캔이 빠르다는 의미이다.
만약 PK 순서대로 디스크에 저장되어있지 않다면 어떤일이 벌어질까?
메모리에는 PK가 순서대로 올라와 데이터를 빠르게 찾을 수 있다. 하지만 디스크에 여러군데에 퍼져있다면 메모리에서 해당 디스크에 가서 데이터를 찾아와야 한다. 즉, 순서대로 디스크에 저장되어 있다면 메모리에서 읽고 디스크로 가서 모든 데이터를 가져올 수 있다는 의미이다.
하지만 순서대로 디스크에 저장되어 있지 않다면 메모리에서 읽고 디스크로 가서 1개의 데이터만 가져오고, 다시 메모리를 읽어 다른 위치에 있는 디스크에 가서 데이터를 가져오는 작업이 계속 추가로 발생하는 것이다.
하지만 단점도 존재한다.
클러스터 인덱스 위에 구성되어있기 때문에 세컨더리 인덱스(PK가 아닌 인덱스)를 만드는 경우에 세컨더리 인덱스에 PK값이 자동으로 추가된다.
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
CREATE INDEX idx_name ON users(name);
idx_name: (name, id)
위 예시를 보면 되는데 MySQL은 클러스터 인덱스이기 때문에 세컨더리 인덱스를 추가하는 경우 자동으로 PK가 같이 저장된다.
따라서 아래쿼리를 세컨더리 인덱스로 찾는 경우
SELECT * FROM users WHERE name = '김철수';
1. 세컨더리 인덱스에서 '김철수' 찾기 -> pk = 1
2. 클러스터 인덱스에서 id = 1로 디스크에 가서 실제 데이터 찾기
이런식으로 진행된다.
말이 좀 새긴 했지만 핵심은 세컨더리 인덱스에 PK값이 추가된다는 의미이다.
이는 인덱스의 크기가 커진다는 단점이 있고 바로 데이터를 읽는게 아닌 클러스터 인덱스를 읽어야 하기 때문에 2번의 디스크 I/O가 발생해 속도가 느릴 수 있다.
요약: MySQL(InnoDB)은 중, 소규모 애플리케이션에서 장점이 있다. 이는 클러스터 인덱스를 활용하기 때문이고 만약 데이터가 많아지고 여러번의 Join이 발생한다면 디스크 I/O의 증가로 성능상 단점이 있다.
결론
SQL 3대장인 Oracle, PostgreSQL, MySQL에 대한 자료를 찾아보면서 데이터베이스에 대한 지식을 좀더 쌓을 수 있었다.
또한 오픈소스 DB가 아닌 Oracle이 기업 입장에서 가장 인기 있는 이유도 알 수 있었다.
엄청 자세하게 다루지는 못했지만 추가적으로 계속 자료를 추가하겠다...!
출처
https://www.postgresql.org/docs/current/runtime-config-query.html
https://rastalion.dev/mysql-8-0-vs-postgresql-16-%EC%8B%AC%EC%B8%B5-%EB%B9%84%EA%B5%90-%EB%B6%84%EC%84%9D
https://f-lab.kr/insight/mysql-vs-postgresql
https://nomadlee.com/mysql-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%A7%84-%EC%A2%85%EB%A5%98-%EB%B0%8F-%ED%8A%B9%EC%A7%95/
https://ysyblog.tistory.com/390
'일기' 카테고리의 다른 글
| [개발일기] - 파티셔닝과 샤딩 (1) | 2025.10.05 |
|---|---|
| [개발일기] - 인덱스에 대해서 자세히 알아보기 (0) | 2025.10.01 |
| [개발일기] 09.17 - JVM의 GC는 어떻게 동작할까? (0) | 2025.09.17 |
| [개발일기] 09.16 - 자바 JVM은 어떻게 동작할까? (0) | 2025.09.16 |
| 6.9 - 오늘의 기록 (채팅 이해, 다양한 방법으로 구현) (0) | 2025.06.09 |