[DBMS] SQLite vs MySQL vs PostgreSql: 관계형 DB 시스템의 비교. - (2) MySQL
SQLite, MySQL, PostgreSql을 비교하고 어떤 경우에 어떤 DB가 더 나은 선택인지에 대해 알아봅니다.
이 글은 다음 글을 발췌 및 번역한 글입니다: do.co/3kD2Ybd
1. 소개.
데이터를 테이블의 행(row)과 열(column)로 구성하는 관계형 데이터 모델은 DB 관리 툴에 있어서 대세를 차지하고 있습니다. 최근 NoSQL과 NewSQL을 포함한 다른 데이터 모델이 있지만 관계형 데이터 베이스 관리 시스템(RDBMS)은 데이터를 저장하고 관리하는 데 있어 여전시 전 세계적으로 대다수를 차지합니다.
앞으로 작성할 글에서는 가장 널리 구현된 세 가지 오픈소스 RDBMS인 SQLite, MySQL 및 PostgreSQL을 비교하고 대조합니다. 특히 각 RDBMS가 제공하는 데이터 타입, 장점과 단점, 최적의 상황에 대해 알아보도록 합니다.
2. MySQL
DB-Engines 랭킹에 따르면 MySQL은 2012년 사이트가 데이터베이스의 인기 순위를 집계하기 시작한 이후 가장 있기 있는 오픈소스 RDBMS였습니다. 트위터, 페이스북, 넷플릭스, 스포티파이등을 포함한 세계 최대 웹사이트 및 애플리케이션에서 사용되고 있는 다양한 기능을 가진 제품입니다. 다양한 부분에서 철저한 문서와 대규모 개발자 커뮤니티뿐 아니라 온라인에 MySQL 관련 정보가 풍부하기 때문에 MySQL을 시작하는 것은 비교적 간단합니다.
MySQL은 표준 SQL을 완전히 준수하지 않는 대신 속도와 안정성을 위해 디자인되었습니다. MySQL 개발자는 표준 SQL을 더 가깝게 지키기 위해 지속적으로 노력하고 있지만 여전히 다른 SQL의 구현체보다 뒤처져 있습니다. 그러나 다양한 SQL 모드 및 확장 기능을 제공하며 규정을 지키려 하고 있습니다. SQLite를 사용하는 애플리케이션과 달리 MySQL을 사용하는 애플리케이션은 별도의 데몬 프로세스를 통해 데이터베이스에 액세스 합니다. 서버 프로세스는 데이터 베이스와 다른 응용프로그램 사이에 있기 때문에 데이터베이스에 액세스 할 수 있는 사용자들을 더 잘 제어할 수 있습니다.
MySQL은 기능을 확장하고 더 쉽게 작업을 할 수 있도록 도와주는 다양한 타사 애플리케이션, 도구, 통합 라이브러리에 영향을 주었습니다. 이러한 타사 도구 중 가장 널리 사용되는 것들 중 일부는 phpMyAdmin, DBeaber, HeidiSQL입니다.
3. MySQL의 데이터 타입
MySQL의 데이터 타입은 numeric 타입, date와 time 타입, string 타입의 세 가지 카테고리로 구분할 수 있습니다.
3.1. Numeric 타입.
- tinyint: 매우 작은 정수 값. 부호 있는 범위는 -128~127이고 부호 없는 범위는 0~255입니다.
- smallint: 작은 정수값. 부호 있는 범위는 -32768~32767이고 부호 없는 범위는 0~65535입니다.
- mediumint: 중간 크기의 정수값. 부호 있는 범위는 -8388608~8388607이고 부호 없는 범위는 0~16777215입니다.
- int, integer: 일반적인 정수 값. 부호 있는 범위는 -2147483648~2147483647이고 부호 없는 범위는 0~4294967295입니다.
- bigint: 큰 정수값. 부호 있는 범위는 -9223372036854775808~9223372036854775807이고 부호 없는 범위는 0~18446744073709551615입니다.
- float: 작은(Single-precision) 부동 소수점 숫자.
- double, double precision, real: 일반(Double-precision) 부동 소수점 숫자.
- dec, decimal, fixed, numeric: 고정 소수점 숫자. 데이터 타입에 대한 표시 길이는 열(column)이 작성될 때 정의되며 모든 항목은 해당 길이를 준수합니다.
- bool, boolean: Boolean은 일반적으로 true 또는 false값만 갖습니다.
- bit: 1에서 64까지 값마다 비트수를 지정할 수 있는 비트 값 유형입니다.
3.2. Date와 Time 타입.
- date: YYYY-MM-DD로 표시되는 날짜.
- datetime: 날짜와 시간을 표시하는 타임스탬프. YYYY-MM-DD HH:MM:SS로 표시됩니다.
- timestamp: Unix시(1970-01-01 00:00:00) 이후의 시간을 나타내는 타임스탬프.
- time: HH:MM:SS로 표시되는 시간.
- year: 두 자리 또는 네 자리 형식으로 표현된 연도. 기본값은 네 자리입니다.
3.3. String 타입.
- char: 고정 길이 문자열. 저장 시 지정된 길이에 맞도록 나머지가 공백으로 채워집니다.
- varchar: 가변 길이 문자열.
- binary: char 타입과 유사하지만 지정된 길이에 맞는 이진 문자열이 저장됩니다.
- varbinary: varchar 타입과 유사하지만 가변 길이의 이진 문자열이 저장됩니다.
- blob: 데이터의 최대 길이가 65535인 이진 문자열.
- tinyblob: 데이터의 최대 길이가 255인 이진 문자열.
- mediumblob: 데이터의 최대 길이가 16777215인 이진 문자열.
- longblob: 데이터의 최대 길이가 4294967295인 이진 문자열.
- text: 최대 길이가 65535인 문자열.
- tinytext: 최대 길이가 255인 문자열.
- mediumtext: 최대 길이가 1677215인 문자열.
- longtext: 최대 길이가 4294967295인 문자열.
- enum: 열거형. 테이블을 만들 때 선언된 값 목록 중 단일 값을 가져오는 문자열 개체.
- set: 열거형과 유사하게 0개 이상의 값을 가질 수 있는 문자열 개체. 각 값은 테이블이 생성될 때 지정한 허용 가능한 목록에서 선택되어야 합니다.
4. MySQL의 장점.
인기 있고 사용하기 편한 데이터베이스입니다. 세계에서 가장 인기 있는 데이터베이스 시스템중 하나입니다. MySQL 작업 경험이 있는 데이터베이스 관리자가 부족하지 않습니다. 마찬가지로 MySQL 데이터 베이스를 설치하고 관리하는 방법과 데이터베이스 시작 프로세스를 단순화하는 것을 목표로 하는 여러 가지 타사 도구(예를 들면 phpMyAdmin)에 대한 온라인 설명서가 많습니다.
보안 수준이 높은 데이터베이스입니다. MySQL은 설치 시 암호 보안 수준을 설정할 수 있고 루트 사용자의 암호를 정의하며 익명 계정을 제거하고 모든 사용자가 접근할 수 있는 기본 테스트 데이터베이스를 제거하여 보안을 향상하는데 도움이 되는 스크립트와 함께 설치됩니다. 또한 SQLite와 달리 MySQL은 사용자 관리를 지원해 사용자 별로 액세스 권한을 부여할 수 있습니다.
속도가 빠른 데이터베이스입니다. MySQL 개발자들은 SQL의 특정 기능을 구현하지 않기로 선택함으로써 속도를 우선순위로 지정할 수 있었습니다. 최근의 벤치마크 테스트에 따르면 PostgreSQL과 같은 몇몇의 RDBMS가 속도 측면에서 MySQL과 비슷할 수 있음을 보여주었지만 MySQL은 여전히 매우 빠른 데이터베이스 솔루션으로 명성을 얻고 있습니다.
복제(Replication) 기능을 지원합니다. MySQL은 안정성(Reliability), 가용성(Availability), 내결함성(Fault-tolerance)을 향상하기 위해 두 개 이상의 호스트에서 정보를 공유하는 방식인 여러 유형의 복제(Replication) 기능을 지원합니다. 이는 데이터베이스 백업 솔루션을 설정하거나 데이터베이스를 수평적으로 확장하는데 유용합니다.
5. MySQL의 단점.
알려진 제한 기능이 있습니다. MySQL은 완전한 SQL의 준수보다는 속도와 사용 편의성을 위해 디자인되었기 때문에 특정 기능을 사용하는데 제한이 있습니다. 예를 들자면 FULL JOIN절에 대한 지원이 없습니다.
라이선스 및 독점 기능에 대한 제약이 존재합니다. MySQL은 GPLv2에 따라 라이선스가 부여된 무료 오픈 소스 커뮤니티 에디션과 독점 라이선스에 따라 출시된 여러 유료 상용 에디션이 있는 이중 라이선스 소프트웨어입니다. 이로 인해 일부 기능 및 플러그인은 독점 라이선스 버전에서만 사용할 수 있습니다.
느린 개발에 대한 불만이 존재합니다. MySQL 프로젝트는 2008년에 Sun Microsystem에, 그리고 2009년에 Oracle corporation에 인수된 이후 커뮤니티에는 더 이상 문제에 대해 신속하게 대응하고 변화를 구현할만한 주체가 사라졌기 때문에 DBMS 개발 프로세스가 크게 느려졌다는 사용자 불만이 존재합니다.
6. MySQL를 사용하면 좋은 경우.
분산 작업이 필요한 경우에 적합합니다. MySQL의 복제 기능 지원은 Primary-Secondary 또는 Primary-Primary 구조와 같은 분산 데이터베이스 설정에 적합한 선택입니다.
웹 사이트 및 웹 애플리케이션에 적합합니다. MySQL은 인터넷을 통해 많은 웹 사이트와 애플리케이션을 지원합니다. 이는 대체로 MySQL 데이터베이스를 설치하고 설정하는 것이 쉽고 속도가 빠르며 장기적으로 봤을 때 확장성이 좋기 때문입니다.
향후 성장이 예상되는 제품에 적합합니다. MySQL의 복제 기능 지원은 수평적 확장에 도움이 될 수 있습니다. 또한 다른 수평적 확장 프로세스인 자동 샤딩(Automatic Sharding)을 지원하는 MySQL Cluster와 같은 상용 MySQL 제품으로 업그레이드하는 것은 어렵지 않습니다.
7. MySQL를 사용하면 안 되는 경우.
SQL 준수가 필요한 경우 적합하지 않습니다. MySQL은 전체 표준 SQL을 구현하려 하지 않기 때문에 모든 SQL을 완전히 준수하지 않습니다. 만약 완전히 또는 거의 완전한 SQL 준수가 필요한 경우보다 완벽하게 SQL과 호환되는 DBMS를 사용하는 것이 좋습니다.
동시성(Cuncurrency)과 대용량 데이터 볼륨이 요구되는 경우 적합하지 않습니다. MySQL은 일반적으로 읽기가 많은 작업에서 잘 수행되지만 동시에 읽기와 쓰기 작업이 일어나는 경우는 문제가 될 수 있습니다. 응용프로그램에 한 번에 많은 사용자가 데이터를 쓰는 경우 PostgreSQL과 같은 다른 RDBMS가 더 나은 선택이 될 수 있습니다.
8. 마침.
이상으로 MySQL의 데이터 타입, 장단점, 사용하면 좋은 경우와 그렇지 않은 경우에 대해 알아보았습니다. 다음 글에선 PostgreSQL에 대해 알아보도록 하겠습니다.