[DB] MySQL - InnoDB vs MyISAM

Coodori·2023년 7월 3일
0

Study

목록 보기
2/10
post-custom-banner

InnoDB의 특징

InnoDB는 기본적으로 트랜잭션을 관리한다.

  • 동시성과 일관성을 보장
  • default 값으로 repeatable Read 방식으로 커밋된 데이터만 읽는다.

InnoDB 는 모든 바이너리 배포판에 default 로 포함되어 있다.
트랜잭션 처리가 필요하다.
이후 살펴볼 MyISAM 과 비슷하지만 많은 오라클과 비슷한 기능을 하고 있다.

  • commit
  • rollback
  • 장애복구
  • row-level locking
  • 외래키등

또, 다수의 사용자가 동시접속을 하여 퍼포먼스가 증가했을때 대용량 데이터를 처리할때 최대의 퍼포먼스가 가능하다.

CPU 효율 자체는 디스크 기반 데이터 베이스 중에 좋은 성적이고 자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀을 관리한다.

이 부분은 차이점인데 Index를 테이블 스페이스 안에서 저장을 하고 테이블 스페이스는 몇개의 서버파일이나 디스크 파티션으로 구성이 되어있다.
그래서 풀텍스트 인덱스를 지원하지 못한다.

고로 트랜잭션 처리가 필요하고 대용량의 데이터를 다룰때(데이터의 변화가 많은 서비스 CRUD) 적합하다.
또한 위에서 소개한 기능들이 필요한 경우 + ORDER BY 가 필요한 경우에 사용한다고 볼 수 있따.

MyISAM

기본적으로 MyISAM 은 비 트랜잭션 세이프 테이블을 관리한다.
MyISAM은 항상 테이블에 ROW Count를 가지고 있다.
그래서 count(*) 문을 사용할때 굉장히 빠른 속도를 보여준다.

SELECT문을 사용시에 빠른 속도를 자랑한다.
또한 풀텍스트 인덱스를 지원하는데

풀텍스트 인덱스란?
검색엔진과 유사한 방법으로 자연 언어를 이용해 검색할 수 있는 특별한 인덱스로 모든 데이터 문자열을 저장한다.

이것도 기본적으로 모든 MySQL 구성에서 지원되며 다른 타입의 엔진으로 디폴트를 구성하지 않는 이상 이 엔진이 default 로 구성된다.

마지막으로 InnoDB와의 차이점은 row-level-locking 을 지원하지 못해서
CUD시 해당 테이블 전체에 Locking 이 걸린다.

  • row 수가 커지면 속도는 엄청나게 느려진다.
  • orderBy 사용시 느림
  • 자동복구 x -> 비정상 종료시 데이터 파손 여부 높음

어느 상황에 어떤걸 선택해야할까?

대용량 데이터를 처리하고 트랜잭션관리가 필요하고 복구 및 정렬 구문이 빈번하면 InnoDB (무겁고 느리다.)

반대로

읽기 위주의 작업과 전문 검색이 필요하며 트랜잭션 관리가 빈번하지 않고 한번에 데이터를 많이 입력하는 배치성 테이블일경우 MyISAM 엔진을 사용하는 것이 좋을 듯하다.(가볍고 빠르다.)

번외로 두 테이블을 같이 사용할시 index 관리법이 달라 조인시에 주의해야한다.

느낀점

가볍고 빠르고 성능이 좋은 것이 가장 좋겠지만 늘 개발자는 기능과 무게에서 줄타기를 하는 Trade-off 과정을 생각하게 되는 것 같다.

이번 역시 과거 Entity 와 Dto 조회에 대한 생각처럼 결국 가볍고 빠르더라도 우리가 꼭 필요한 기능이나 혹은 상황에 따라 매번 달라지니 결국 적용해보는 수밖에 없다.

번외

스프링에서 스토리지 엔진 yml 작성법

기존 :
    database-platform: org.hibernate.dialect.MySQL5Dialect //MyISAM 
변경 후 :
	database-platform: org.hibernate.dialect.MySQL57Dialect // InnoDB

Reference

https://velog.io/@gillog/DBInnoDB-VS-MyISAM
https://jwdeveloper.tistory.com/174
https://needjarvis.tistory.com/45
https://rebeccajo.tistory.com/14

profile
https://coodori.notion.site/0b6587977c104158be520995523b7640
post-custom-banner

0개의 댓글