[MySQL] MyISAM 와 InnoDB 비교

    현재 하고 있는 프로젝트는 MySQL DB를 사용하고 있고, TA로 투입이 되면서 테이블을 설계 업무도 병행하게 되었다. (물론 다 하는건 아니었지만)


    큰 그림을 그리는 작업을 하는 거라, 업무별 테이블 설계는 해당 업무의 특성인 조회 특화, 트랜잭션 없음, 집계 필요 등 데이터마이닝용 테이블 설계라 MyISAM 쪽으로 가닥을 잡고 설계를 했다.



    사실 처음에는 InnoDB로 테이블을 생성하여 테스트를 하였는데...

    10만건당, 테이블에 밀어넣는(Batch Insert) 작업이 약 10초정도 걸렸고, MyISAM은 7초정도에 끝났기 때문에.. 고민은 끝난듯 보였다. 데이터의 사이즈가 꽤나 큰 작업이었고, 배치 속도도 상당히 중요했기 때문이다.


    전체적으로 배치작업을 진행하면서, InnoDB는 약 2시간, MyISAM은 1시간 30분 이내로 떨어졌기 때문에 셀렉트 성능만 잘 나오면, 고민을 할 필요가 없었다.


    그러나, 문제는 사이트 오픈 이후 발생하였다.

    내 머리속에 편견은 당연히, InnoDB보다 MyISAM은 기능이 부족하기에 셀렉트의 성능이 더 잘나올거라 판단한 것이 큰 오판이었다.


    단계별 오픈 이후, 사용자가 특정 쿼리를 호출 후에 쿼리가 밀리는 현상이 발생하였고, 결국 Rollback을 할 수 밖에 없는 문제가 발생하였고, 새벽까지 작업을 한 끝에 DA(데이터 아키텍쳐)분이 MyISAM을 시험삼아 InnoDB로 변경한 후, 부하테스트시 속도가 상당수 개선이 되었다.


    내부적으로 내린 우리들의 테스트 결과는 아래와 같다.

    1. 순수 데이터를 입력하는 속도는 MyISAM이 InnoDB보다 약 30% 더 빠르다
    2. 카운트 함수(집계)등을 사용할 때는 MyISAM이 InnoDB보다 빠르다
    3. Order by 가 들어가면, InnoDB가 압도적으로 빠르다

    문제는 3번이었다. 쿼리 특성상 Order By를 쓰는 경우가 많았는데, Order by 에서 압도적인 차이로, InnoDB가 빨랐다(사실 MyISAM이 느렸음...)

    아래는 구글링 후 찾은, MyISAM과 InnoDB를 비교한 내용이다.

    이미지, https://support.rackspace.com/how-to/mysql-engines-myisam-vs-innodb


    위 비교표만 봐도, 어떤 상황일 때 어떤 타입을 써야 할지 확실히 알 수 있다.

    추가적으로 MyISAM과 InnoDB 중 Locking 단위도 상당히 중요하다.

    MyISAM은 테이블 단위로 락킹을 걸기 때문에, 락 때문에 셀렉트나 테이블을 밀어넣는 작업에 문제가 발생할 수 있다. 실제 프로젝트를 하면서, Locking 문제로 고생좀 했다(이젠 끝~~~)


    그럼 어떤 상황일 때 어떤 타입을 써야 할 것인지 요약을 해보자면,


    1. InnoDB이 유리한 경우

    • 대용량의 데이터를 컨트롤 하는 경우

    • 트랜잭션 관리가 필요한 경우

    • 복구가 필요할 경우

    • 정렬등의 구문이 들어가는 경우

    • IUD 등이 빈번하게 발생하는 경우(Row-Level locking 때문에)


    2. MyISAM이 유리한 경우
    • 읽기 위주의 작업만 필요할 경우
    • 전문 검색이 필요할 경우
    • 트랜잭션이나 복구등이 필요 없을 경우
    • 한번에 대량의 데이터를 입력하는 배치성 테이블

    물론, 위 내용을 보면 단순히 MyISAM이 조회 성능에는 유리한 면을 보여주지만, 락관리, IUD등이 일어날 경우, InnoDB로 훅 가버리니, 사실 두가지 모두 내부 테스트를 하여, 오픈할 수 있도록 하자ㅠㅠ



    댓글

    Designed by JB FACTORY