RDBMS를 선택하기 위한 기준은 다음 순서대로 생각해보면 좋다
- 안정성
- 성능과 기능
- 커뮤니티나 인지도
여기서 추가적으로 비용까지 고려해서 비교해보자.
비교할 RDBMS들은 'DB-Engines'의 랭킹 1위부터 4위까지중, windows 플랫폼에 최적화된 'Microsoft SQL Server'를 제외하고 'Oracle', 'MySQL', 'PostgreSQL'만으로 비교해보겠다.
비교
1. 안정성
- ACID 준수 여부 -> ACID를 준수하는가?
- Oracle: ACID를 완벽하게 준수
- PostgreSQL: ACID를 완벽하게 준수
- MySQL: InnoDB 엔진 사용시 ACID를 준수하지만, 기본 설정에서는 읽기 일관성(Read Consistency)를 보장하지 않기에, 별도 설정이 필요하다
- 장애 발생 시 데이터 복구 -> 충돌이나 장애 발생시 데이터를 복구할 수 있는가?
- Oracle: 'Redo Log'와 백업을 통해 복구 가능하다. 성능이 우수하다
- PostgreSQL: 'Write Ahead Log'를 통해 복구 가능하다. 성능이 우수하다
- MySQL: 'Binary Log'와 백업을 통해 복구 가능하다. 성능은 보통수준
- 업타임 -> 얼마나 오랜 시간 중단없이 운영이 가능한가?
- 세 개의 RDBMS 모두 99.99% 이상의 높은 업타임을 보장
- 이는 연간 52.6m의 다운 타임만 허용된다는 의미로, 매우 높은 수준이다
- 고가용성 -> 서버 장애시 복원 능력이 어떠한가?
- Oracle: RAC(Real Application Clusters) 기술을 통해 우수한 고가용성을 보장한다. 하지만 구축 난이도가 높고 비용이 많이든다
- PostgreSQL: Replication, Clustering으로 고가용성을 보장한다. 구축 난이도와 비용은 중간정도
- MySQL: Replication, Clustering으로 고가용성을 보장한다. Replication은 구축 난이도와 비용이 상대적으로 낮다
2. 성능과 기능
- 읽기, 쓰기 성능
- Oracle
- 읽기, 쓰기 둘 다에 모두 우수한 성능을 보임
- PostgreSQL
- 읽기에 준수한 성능을 보임. 단순 읽기에서는 MySQL보다 약간 낮을 수 있음. 하지만 복잡한 읽기 작업에서는 MySQL보다 성능이 좋음
- 또한 쓰기 작업에서 대용량 데이터를 다룰 때 MySQL보다 안정적임
- MySQL:
- 읽기에 준수한 성능. 특히 InnoDB를 사용하면 읽기 성능이 크게 향상됨. 하지만 복잡한 읽기에서는 SQL 최적화가 필요함
- 또한 쓰기 성능에서 대용량 데이터를 다룰 때 Table Lock으로 인해 병목 현상이 발생할 수 있음
- 비교: Oracle > PostgreSQL >= MySQL
- 동시성 처리
- Oracle
- MVCC(Multi-Version Concurrency Control)을 사용하여 높은 수준의 동시성을 보장함
- PostgreSQL
- MVCC를 사용하여 Oracle과 유사한 동시성 처리 방식을 채택
- 하지만 Oracle에 비해 Lock 경합이 조금 더 발생
- MySQL
- MVCC를 부분적으로 지원하지만, 기본적으로 테이블 수준의 Lock을 사용
- 따라서 동시 쓰기 작업시 경합이 발생
- InnoDB를 사용하면 행 수준 락(Row-level Lock)을 지원하여 동시성이 향상되지만, 다른 두 DB에 미치지는 못함
- 비교: Oracle > PostgreSQL > MySQL
- 쿼리 최적화
- Oracle
- 룰 기반 옵티마이저(Rule-based Optimizer)와 비용 기반 옵티마이저(Cost-based Optimizer)를 모두 지원
- 통계 정보를 활용하여 최적의 실행 계획을 수립하고, 힌트(Hint)를 사용하여 실행 계획을 제어할 수 있음
- 따라서 복잡한 쿼리에 대해서도 높은 수준의 최적화를 수행
- PostgreSQL
- 비용 기반 옵티마이저를 사용
- 다양한 Join 알고리즘과 Index를 활용하여 쿼리를 최적화
- 통계 정보를 수집하고 활용하여 실행계획을 수립함
- 따라서 복잡한 쿼리에 대해서도 우수한 최적화 기능을 제공
- MySQL
- 비용 기반 옵티마이저를 사용하지만, Oracle이나 POstgreSQL에 비해서 다소 성능이 떨어짐
- 통계 정보의 활용도가 상대적으로 낮음
- 복잡한 쿼리에 대한 최적화 기능이 제한적
- 하지만 버전이 올라갈수록 지속적으로 개선중
- 비교: Oracle >= PostgreSQL > MySQL
- 확장성 (Scale-up: 단일 서버 성능 향상, Scale-out: 여러 대의 서버로 분산 처리)
- Oracle
- 수직적 확장: 대용량 메모리와 CPU를 지원하여 수직적 확장성이 매우 우수
- 수평적 확장: RAC(Real Application Clusters)를 통해 수평적 확장을 지원. 하지만 비용과 구축 난이도가 높음
- PostgreSQL
- 수직적 확장: 대용량 메모리와 CPU를 지원하지만, Oracle에 비해서는 다소 제한적
- 수평적 확장: Citus, TimescaleDB 등의 확장 솔루션을 활용 할 수 있고, Sharding도 가능. 비용 대비 효과가 좋음
- MySQL
- 수직적 확장: 상대적으로 대용량 메모리와 CPU 지원에 한계가 있기에, 수직적 확장성이 다소 낮음
- 수평적 확장: Sharding과 Replication을 활용하여 구현할 수 있음. 비교적 간단하고 저렴하게 구축할 수 있어 수평적 확장성이 매우 우수한 편
- 비교
- 수직적 확장: Oracle > PostgreSQL > MySQL
- 수평적 확장: MySQL >= PostgreSQL > Oracle
3. 커뮤니티 및 인지도 & 비용
- 학습 난이도
- MySQL > PostgreSQL > Oracle
- MySQL이 가장 쉽고, PostgreSQL, Oracle 순으로 어려움
- Reference의 풍부함
- MySQL > PostgreSQL > Oracle
- 위의 순서대로 무료 Reference가 풍부함
- 라이선스 비용
- Oracle: 고가의 유료 라이선스
- PostgreSQL: 오픈소스, 무료
- MySQL: 오픈소스, 하지만 상용 에디션은 유료
- 고성능/고가용성을 구축할 때의 비용
- Oracle: 고가
- PostgreSQL : 중간 가격대
- MySQL: 저가
결론
- 대용량 데이터, 높은 트래픽, 뛰어난 성능과 안정성이 필요한 경우
- Oracle: 비용 제약이 없을시, 최고 수준의 성능과 안정성, 기술 지원을 받을 수 있다
- PostgreSQL: 비용이 부담된다면, 오픈 소스중 최고 수준의 안정성과 확장성을 보장하는 PostgreSQL을 추천한다
- 일반적인 데이터와 트래픽, 비용 대비 성능을 원하는 경우
- MySQL: 빠른 구축과 낮은 진입장벽을 원하고, 상대적으로 단순한 쿼리를 사용하는 개인/중소기업/스타트업이라면 MySQL을 추천
- PostgreSQL: 빠른 구축보다는 조금 더 고성능, 고기능을 원하지만 비용이 부담되는 경우 PostgreSQL을 추천한다
Reference
- Real MySQL 8.0
- DB-Engines Ranking: https://db-engines.com/en/ranking/relational+dbms
DB-Engines Ranking
Popularity ranking of relational DBMS.
db-engines.com