InnoDB는 기본적으로 트랜잭션을 관리한다.
InnoDB 는 모든 바이너리 배포판에 default
로 포함되어 있다.
트랜잭션 처리가 필요하다.
이후 살펴볼 MyISAM 과 비슷하지만 많은 오라클과 비슷한 기능을 하고 있다.
또, 다수의 사용자가 동시접속을 하여 퍼포먼스가 증가했을때 대용량 데이터를 처리할때 최대의 퍼포먼스가 가능하다.
CPU 효율 자체는 디스크 기반 데이터 베이스 중에 좋은 성적이고 자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀을 관리한다.
이 부분은 차이점인데 Index를 테이블 스페이스 안에서 저장을 하고 테이블 스페이스는 몇개의 서버파일이나 디스크 파티션으로 구성이 되어있다.
그래서 풀텍스트 인덱스를 지원하지 못한다.
고로 트랜잭션 처리가 필요하고 대용량의 데이터를 다룰때(데이터의 변화가 많은 서비스 CRUD) 적합하다.
또한 위에서 소개한 기능들이 필요한 경우 + ORDER BY 가 필요한 경우에 사용한다고 볼 수 있따.
기본적으로 MyISAM 은 비 트랜잭션 세이프 테이블
을 관리한다.
MyISAM은 항상 테이블에 ROW Count를 가지고 있다.
그래서 count(*) 문을 사용할때 굉장히 빠른 속도를 보여준다.
SELECT
문을 사용시에 빠른 속도를 자랑한다.
또한 풀텍스트 인덱스를 지원하는데
풀텍스트 인덱스란?
검색엔진과 유사한 방법으로 자연 언어를 이용해 검색할 수 있는 특별한 인덱스로 모든 데이터 문자열을 저장한다.
이것도 기본적으로 모든 MySQL 구성에서 지원되며 다른 타입의 엔진으로 디폴트를 구성하지 않는 이상 이 엔진이 default 로 구성된다.
마지막으로 InnoDB
와의 차이점은 row-level-locking 을 지원하지 못해서
CUD시 해당 테이블 전체에 Locking 이 걸린다.
대용량 데이터를 처리하고 트랜잭션관리가 필요하고 복구 및 정렬 구문이 빈번하면 InnoDB
(무겁고 느리다.)
반대로
읽기 위주의 작업과 전문 검색이 필요하며 트랜잭션 관리가 빈번하지 않고 한번에 데이터를 많이 입력하는 배치성 테이블일경우 MyISAM
엔진을 사용하는 것이 좋을 듯하다.(가볍고 빠르다.)
번외로 두 테이블을 같이 사용할시 index 관리법이 달라 조인시에 주의해야한다.
가볍고 빠르고 성능이 좋은 것이 가장 좋겠지만 늘 개발자는 기능과 무게에서 줄타기를 하는 Trade-off 과정을 생각하게 되는 것 같다.
이번 역시 과거 Entity 와 Dto 조회에 대한 생각처럼 결국 가볍고 빠르더라도 우리가 꼭 필요한 기능이나 혹은 상황에 따라 매번 달라지니 결국 적용해보는 수밖에 없다.
스프링에서 스토리지 엔진 yml 작성법
기존 :
database-platform: org.hibernate.dialect.MySQL5Dialect //MyISAM
변경 후 :
database-platform: org.hibernate.dialect.MySQL57Dialect // InnoDB
https://velog.io/@gillog/DBInnoDB-VS-MyISAM
https://jwdeveloper.tistory.com/174
https://needjarvis.tistory.com/45
https://rebeccajo.tistory.com/14