Image

MySQL 은 간편하다는 장점으로 웹 분야에서 다양하게 쓰인다. 보통 웹에서 DB 하면 MySQL 을 뜻하는 것처럼 말이다. 워드프레스, 그누보드 등과 같은 프로그램들도 보통 MySQL 과의 연동하기 때문이다. 다만 MySQL 은 오래되고 다양하게 쓰이는 만큼 버전에 따라 미묘하게 다른 부분들이 있다. 역시 제일 큰 변화라고 하면 MySQL 이 오라클에 인수됌에 따라 MariaDB 가 나온 것이다. MySQL 이 오라클 소속이 되면서 이중 라이선스가 되었는데 커뮤니티 버전은 GPL v2 에 따라 수정해서 배포하는 경우 공개해야하는 제약이 있고 (기업용으로 사용해도 무방함), 상용 라이선스는 기술 지원과 고가용성, 백업, 모니터링 등의 기능을 지원한다. 이것에 반발해서 나온 것이 MariaDB 로 MySQL 5.5 버전까지는 완벽하게 호환된다. 그 이후 버전부터는 조금씩 다른 부분이 있으나 대부분 호환 되고, GPL 공포 마케팅으로 인해 MariaDB 를 많이 쓰는 추세이다.

개인적으로 MySQL 의 큰 변화라고 하면 5.5 버전에서 InnoDB 가 기본적인 DB 엔진이 된 것이다. 그 전에도 InnoDB 는 있었지만, 보통은 기본 엔진인 MyISAM 을 썼었기 때문이다. MyISAM 과 InnoDB 차이점은 다음과 같다.

MyISAM

  • Read Only 기능이 많은 서비스일수록 효율적이다. (select 를 많이 하는 서비스)
  • 풀텍스트 인덱스를 지원한다.
  • UPDATE, DELETE 등의 작업시 테이블 단위로 LOCK 한다.

InnoDB

  • 트랜젝션을 지원한다.
  • row level lock 을 지원한다.
  • CRUD 가 많은 서비스에 유리하다.

보통 이렇게 정리를 한다. 사용해보면서 느낀 특징은 MyISAM 의 경우 데이터 파일을 보면 테이블.MYD (테이블 데이터를 저장), 테이블.MYI (테이블 인덱스 파일), 테이블.FRM (테이블 구조를 저장) 이렇게 세 개의 파일로 저장되는데 이걸 그대로 다른 서버 데이터 디렉토리에 옮기면 적용 되는 점이 편리했다. InnoDB 의 경우 덤프 하는 것을 권장하고 있다. 물론 데이터 정합성이 안 맞는 문제가 종종 있다. 예를 들어 테이블 단위로 LOCK 되다보니 사이트 구조에 따라 내가 수정하거나 검색하면 다른 사람이 볼 수 없는 문제라던지, 리플리케이션 시 제대로 되지 않고 종종 깨지는 문제 같은 것들이 있어서, 레거시가 아니라면 InnoDB 를 사용하고, InnoDB 로 마이그레이션을 추천한다.

Image

InnoDB 를 처음 쓰게 되면 MySQL 에서 일정부분 쓰레드와 램을 상주하는 것을 확인할 수 있는데 이건 캐싱을 위해 할당한 공간으로 my.cnf 에서 수정할 수 있다. 또한 postgresql 처럼 MVCC 을 위해 COMMIT 을 해야한다고 되어 있는데 보통은 AUTO COMMIT 으로 따로 트랜잭션을 위해 START TRANSACTION-COMMIT 블럭으로 묶지 않으면 쿼리문이 바로바로 반영된다. (이 또한 my.cnf 에서 수정할 수 있다.)

보통은 대부분은 InnoDB 를 쓰거나 MariaDB 에서 InnoDB 를 포크하여 만든 XtraDB 를 쓰고 있을 것이다. 하지만 SHOW ENGINE 쿼리를 통해 봤을 때 MyISAM 엔진을 쓰고 있다면 주기적으로 데이터를 CHECK 하여 REPAIR 하거나, InnoDB 로의 마이그레이션을 추천한다.