MySQL

"The world's most popular open source database."

— 가장 널리 쓰이는 오픈소스 데이터베이스라는, 그 누구도 반박할 수 없는 오라클의 당당한 공식 선언.

인터넷 혁명기를 지탱한 3대 무기인 'APM(Apache, PHP, MySQL)'의 핵심 일원이자, 오라클에게 인수된 후 매년 인수합병의 그늘에서 숨죽이고 있는 오픈소스의 양날의 검. 성능도 좋고 다 좋은데, 오라클이 스멀스멀 라이선스 칼춤을 추거나 핵심 기능을 유료 엔터프라이즈 버전으로 묶어버릴 때마다 뒤통수가 서늘해진다.

1. 개요

MySQL은 스웨덴의 MySQL AB사에서 개발했으나 현재는 오라클의 소유가 된, 세계에서 가장 널리 사용되는 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS)이다. 자매품으로 오라클의 인수에 반발해 만든 완전 오픈소스인 MariaDB가 존재한다.

가볍고 빠르며 설치가 매우 단순해 전 세계 애플리케이션 백엔드의 '기본 템플릿' 수준으로 보급되어 있다. 웹의 폭발적 성장기였던 2000년대 초반, 리눅스(Linux), 아파치(Apache), PHP, MySQL의 앞 글자를 딴 LAMP 스택의 철옹성 같은 동맹으로 인터넷 대중화를 일구어낸 유구한 공신이다.(...)

2. 스토리지 엔진과 인덱스 튜닝의 마법: MyISAM vs InnoDB

2.1. MySQL을 구성하는 심장: 스토리지 엔진

MySQL의 독특한 강점 중 하나는 플러그인 형태로 갈아 끼울 수 있는 스토리지 엔진 구조다. 역사적으로 두 가지 엔진이 지배적이었다.

  • MyISAM: 과거 기본 스토리지 엔진. 읽기 속도가 극단적으로 빠르지만 트랜잭션을 지원하지 않고 테이블 전체에 락(Table-level Lock)을 걸어 다중 요청이 오면 먹통이 되는 치명적인 한계가 있었다.
  • InnoDB: 현대 MySQL의 기본 스토리지 엔진. 행 단위 락(Row-level Lock)을 지원해 동시 트랜잭션이 폭발하는 웹 환경에 최적화되어 있으며, 외래키와 트랜잭션(ACID)을 지원하는 구세주다.1

2.2. 인덱스(Index) 설계와 슬로우 쿼리(Slow Query)의 추억

MySQL의 성능 튜닝은 십중팔구 인덱스(Index)에서 결정된다. 기본적으로 B+Tree 구조로 인덱스를 생성하는데, 쿼리를 대충 짜서 인덱스를 타지 않고 수억 건의 레코드를 처음부터 끝까지 다 뒤지는 '풀 테이블 스캔'이 일어나면 순식간에 CPU 점유율이 폭등한다.

이를 해결하기 위해 개발자들은 EXPLAIN 키워드를 쿼리 앞에 수시로 붙여 실행 계획을 분석하고, 실제 데이터까지 가지 않고 인덱스 테이블 안에서 검색을 종결시키는 커버링 인덱스(Covering Index) 설계를 짜기 위해 밤마다 수학 공식 풀듯 짱구를 굴린다.(...)

3. 오라클의 인수와 오픈소스 진영의 분열사

3.1. 악덕 대마왕 오라클의 인수합병

2008년 썬 마이크로시스템즈(Sun Microsystems)가 MySQL AB를 인수했으나, 단 2년 만에 썬이 오라클에게 통째로 넘어가면서 MySQL 역시 오라클의 소나기에 떨어지게 되었다. 이 소식을 들은 전 세계 개발자 커뮤니티는 '오픈소스의 종말이 왔다'며 초상집 분위기가 되었다.2

실제로 오라클은 인수 직후 MySQL의 엔터프라이즈(유료) 버전과 커뮤니티(무료) 버전의 기능 차이를 벌리며 슬슬 비용 청구 압박을 넣기 시작했다. 이에 빡친(?) MySQL 최초 개발자 미카엘 비데니우스는 오라클을 탈출해 기존 MySQL 소스코드를 그대로 포크(Fork)하여 MariaDB를 세상에 내놓았고, 현재는 수많은 Linux 배포판에서 기본 패키지로 MySQL 대신 MariaDB를 밀어주고 있다.

4. MariaDB 탈출과 AUTO_INCREMENT

4.1. AUTO_INCREMENT 뒤통수 사건

MySQL의 대표적 기능인 AUTO_INCREMENT는 기본키 값을 자동으로 1씩 증가시켜 주어 매우 편리하다. 그러나 가끔 분산 DB 환경에서 여러 대의 MySQL 서버가 동일한 시퀀스 번호를 찍어내다가 충돌이 일어나 데이터가 기괴하게 꼬이거나, 정수형(Int)의 최대 허용값(약 21억)을 초과하는 대형 트래픽 서비스에서 값이 더 이상 증가하지 않아 데이터베이스 전체가 락이 걸려 멈추는 슬픈 실무 잔혹사가 종종 발생한다.

5. 여담

  • 이름의 유래: MySQL의 'My'는 최초 고안자인 미카엘 비데니우스의 첫째 딸 이름인 'My'에서 따온 것이다. 자매품인 MariaDB 역시 그의 둘째 딸 이름인 'Maria'에서 유래했다. 딸 사랑이 지독한 개발자가 빚어낸 인류의 유산인 셈이다.
  • 돌고래 마스코트: MySQL의 마스코트는 점프하는 귀여운 돌고래이며, 이름은 '사킬라(Sakila)'이다. 이 이름은 전 세계 돌고래 작명 공모전을 통해 낙찰된 이름으로, 샘플 데이터베이스 스키마에도 버젓이 'sakila'라는 테이블이 들어앉아 주니어 개발자들의 쿼리 연습 상대가 되어주고 있다.
  • 서브쿼리 최적화의 한계: 구버전 MySQL(특히 5.5 이하)은 서브쿼리 최적화가 안드로메다 수준으로 끔찍하게 설계되어 있어, 조금만 서브쿼리가 길어져도 풀 스캔을 때려 박아 쿼리 속도가 수백 배 느려지는 버그 같은 전통이 있었다. 이 때문에 올드 개발자들은 아직도 몸서리를 치며 서브쿼리 대신 자바 백엔드 단에서 여러 번 나누어 조회를 때리는 PTSD성 버릇을 가지고 있다.

6. 관련 문서

각주

  1. MyISAM 엔진을 쓰다가 서버가 갑자기 물리적으로 다운되면 데이터 파일이 깨져서 아예 복구가 불가능해지는 참사가 빈번했기에, 중요 데이터 보관에는 무조건 InnoDB를 써야만 한다.

  2. 오라클은 이미 세계 최고가의 독점 기업 상용 RDBMS를 파는 회사였기 때문에, 자사 고가 DB의 밥그릇을 지키기 위해 무료인 MySQL을 의도적으로 방치하거나 사장시킬 것이라는 음모론이 파다했다.