[MySQL] MyISAM 와 InnoDB 비교
- 빅데이터 및 DB/MySQL
- 2016. 8. 25.
현재 하고 있는 프로젝트는 MySQL DB를 사용하고 있고, TA로 투입이 되면서 테이블을 설계 업무도 병행하게 되었다. (물론 다 하는건 아니었지만)
큰 그림을 그리는 작업을 하는 거라, 업무별 테이블 설계는 해당 업무의 특성인 조회 특화, 트랜잭션 없음, 집계 필요 등 데이터마이닝용 테이블 설계라 MyISAM 쪽으로 가닥을 잡고 설계를 했다.
사실 처음에는 InnoDB로 테이블을 생성하여 테스트를 하였는데...
10만건당, 테이블에 밀어넣는(Batch Insert) 작업이 약 10초정도 걸렸고, MyISAM은 7초정도에 끝났기 때문에.. 고민은 끝난듯 보였다. 데이터의 사이즈가 꽤나 큰 작업이었고, 배치 속도도 상당히 중요했기 때문이다.
전체적으로 배치작업을 진행하면서, InnoDB는 약 2시간, MyISAM은 1시간 30분 이내로 떨어졌기 때문에 셀렉트 성능만 잘 나오면, 고민을 할 필요가 없었다.
그러나, 문제는 사이트 오픈 이후 발생하였다.
내 머리속에 편견은 당연히, InnoDB보다 MyISAM은 기능이 부족하기에 셀렉트의 성능이 더 잘나올거라 판단한 것이 큰 오판이었다.
단계별 오픈 이후, 사용자가 특정 쿼리를 호출 후에 쿼리가 밀리는 현상이 발생하였고, 결국 Rollback을 할 수 밖에 없는 문제가 발생하였고, 새벽까지 작업을 한 끝에 DA(데이터 아키텍쳐)분이 MyISAM을 시험삼아 InnoDB로 변경한 후, 부하테스트시 속도가 상당수 개선이 되었다.
내부적으로 내린 우리들의 테스트 결과는 아래와 같다.
- 순수 데이터를 입력하는 속도는 MyISAM이 InnoDB보다 약 30% 더 빠르다
- 카운트 함수(집계)등을 사용할 때는 MyISAM이 InnoDB보다 빠르다
- Order by 가 들어가면, InnoDB가 압도적으로 빠르다
이미지, https://support.rackspace.com/how-to/mysql-engines-myisam-vs-innodb
위 비교표만 봐도, 어떤 상황일 때 어떤 타입을 써야 할지 확실히 알 수 있다.
추가적으로 MyISAM과 InnoDB 중 Locking 단위도 상당히 중요하다.
MyISAM은 테이블 단위로 락킹을 걸기 때문에, 락 때문에 셀렉트나 테이블을 밀어넣는 작업에 문제가 발생할 수 있다. 실제 프로젝트를 하면서, Locking 문제로 고생좀 했다(이젠 끝~~~)
그럼 어떤 상황일 때 어떤 타입을 써야 할 것인지 요약을 해보자면,
1. InnoDB이 유리한 경우
대용량의 데이터를 컨트롤 하는 경우
트랜잭션 관리가 필요한 경우
복구가 필요할 경우
정렬등의 구문이 들어가는 경우
IUD 등이 빈번하게 발생하는 경우(Row-Level locking 때문에)
- 읽기 위주의 작업만 필요할 경우
- 전문 검색이 필요할 경우
- 트랜잭션이나 복구등이 필요 없을 경우
- 한번에 대량의 데이터를 입력하는 배치성 테이블
'빅데이터 및 DB > MySQL' 카테고리의 다른 글
MySQL, MariaDB의 DB, 계정, 권한 생성 및 설정 (0) | 2018.07.31 |
---|---|
[MySQL] 문자열 추출하기, SUBSTRING, SUBSTR (0) | 2016.09.08 |
Mysql 문자열 합치기 (0) | 2016.08.25 |
윈도우(Windows)에서 MariaDB(Mysql) 설치하기 (0) | 2015.08.12 |
마리아DB (MariaDB) 란? (0) | 2015.07.23 |