DBMS 성능 테스트

내 이 세상 도처에서 쉴 곳을 찾아보았으나, 마침내 찾아낸, 컴퓨터가 있는 구석방보다 나은 곳은 없더라.

DBMS 성능 테스트

지금까지 주로 Oracle을 사용해왔으나, 회사에서는 MySQL을 주로 사용하며 일부 시스템에서 PostgreSQL을 사용한다. MySQL을 사용하는 부분에서 지속적인 성능 문제가 발생하고 있는데, 이는 MySQL을 충분히 알지 못해 나타나는 문제일 수도 있다. MySQL을 사용하면서 지금까지 알고 있던 DBMS에 대한 지식(주로 Oracle에 대한)이 무용지물인 경우가 많았기 때문이다.

예를 들어 Oracle에서는 대량 데이터 로딩 작업을 할 때 인덱스를 모두 삭제한 다음 다이렉트 모드로 데이터를 넣고, 병렬 작업으로 인덱스를 생성(물론 nologging 모드로)하는 것이 가장 빠르다. 이에 대한 내용은 다음 글에 정리되어 있다.

다이렉트 로드와 인덱스

그러나 MySQL에서 이렇게 하는 것은 완전 삽질이라는 것을 알게 되었다. MySQL에서 인덱스를 생성하면 새로 생성하는 인덱스가 있는 임시 테이블을 만든 다음 원래 테이블에서 임시 테이블로 모든 데이터를 복사하는 방식으로 인덱스를 생성한다고 한다. 이것은 인덱스를 삭제할 때도 마찬가지다. 삭제하는 인덱스가 없는 임시 테이블을 만든 다음 테이블의 모든 데이터를 임시 테이블로 복사하고, 복사가 끝나면 테이블 이름을 바꾼단다. MySQL 5.1부터는 테이블 데이터를 복사하지 않고 인덱스를 생성/삭제할 수 있게 되었다고 하나 InnoDB에는 해당되지 않는다. 이에 대한 내용은 다음 URL에서 확인할 수 있다.

http://www.innodb.com/doc/innodb_plugin-1.0/innodb-create-index.html

Oracle이나 PostgreSQL에서 인덱스를 삭제하는 것은 순식간에 처리되지만, MySQL에서는 테이블 크기가 클 경우 인덱스를 삭제하는 작업도 오랜 시간이 걸린다.

얼마 전 분석을 위해 대량 데이터를 DB에 넣어야 할 일이 있었는데, 내가 사용해 본 세 DBMS의 성능을 비교해보기로 했다. 튜닝을 위해 특별한 설정을 하지 않아 모두 디폴트 설정인 상태에서 작업했다. 테스트는 모두 내 PC에서 실행했다. 혹시나 오해가 있을까 해 미리 밝혀둔다.

  1. Oracle의 경우 다년간 DBA를 해 튜닝에 대해 어느 정도 알고 있다. 그러나 아래 테스트에서 특별한 기법을 사용한 것은 아니다.
  2. MySQL의 경우 사용한지 얼마 안 되어 잘 모른다.
  3. PostgreSQL의 경우 사용한지 얼마 되지도 않고, 문서도 많지 않아 MySQL보다 더 모른다.

테스트는 간단했다. 약 1억1천4백만 건의 키워드 데이터(약 660 MB)를 테이블에 넣는 테스트(데이터 로딩)와 키워드를 group by 해서 각 키워드별 빈도(count)를 세어 새로운 테이블을 만드는 테스트(CTAS1) 두 가지다. 테이블에 인덱스는 없는 상태에서 작업했다.

테스트데이터 로딩CTAS (group by)
Oracle1분30초 SQL*Loader(direct=y)1분12초
PostgreSQL17분 COPY ~ FROM5분30초
MySQL20분 30초 LOAD DATA ~ LOCAL1시간 넘도록 끝나지 않음.

MySQL의 경우 Buffer Pool을 160MB로 늘려 다시 작업해도 10분 넘도록 끝나지 않아 중단시켰다.

두 테스트에서 Oracle이 월등한 성능 우위를 나타냈으며, MySQL이 가장 나쁜 성능을 보였다. 일반적으로 MySQL은 가볍고 빠른 DBMS로 알려져 있으나, 가벼운 만큼 허접한 느낌이다. PostgreSQL은 Oracle보다는 성능이 좋지 못했지만, 데이터 로딩의 경우 MySQL보다는 조금 나았고, group by를 통한 테이블 생성에서는 MySQL 보다 훨씬 좋았다. PostgreSQL에서 5분 정도 걸리는 작업을 MySQL에서는 1시간이 지나도록 끝내지 못했다.

MySQL은 위에서 언급한 특징 때문에 데이터를 로드한 후 인덱스를 생성하는 것이 별로 효율적이미 못하므로 인덱스가 있는 상태에서 데이터를 로딩해야 하는데 이 경우 데이터가 테이블에 Insert되면서 지속적인 인덱스 업데이트가 필요하므로 더욱 비효율적이 될 수밖에 없다. 특히 Unique 인덱스가 있는 경우에는 데이터가 많아짐에 따라 Insert 속도가 점점 느려지는 문제가 있다. MySQL에서 Unique 인덱스가 있는 테이블에 대량 데이터를 넣어보면 시간이 지남에 따라 Insert 속도가 점점 느려지는 것을 확인할 수 있다.

결론

역시 DBMS는 Oracle이 좋은 것 같다. 비용문제만 없다면 Oracle이 최선이다(위 셋 중에서). 그러나 비용문제로 오픈소스 DBMS를 사용해야 한다면 PostgreSQL을 추천하고 싶다. PostgreSQL은 스스로를 The world's most advanced open source database라 주장한다. MySQL 홈페이지 상단에는 The world's most popular open source database라는 문구가 있다. 가장 인기있는 오픈소스 데이터베이스인지는 몰라도 셋 중에서 가장 허접한 것 같다.