MyShop 서비스는 InnoDB를 사용하는데, MyISAM과 InnoDB의 차이와 왜 결정하게 되었는지 작성하고자 한다.
MySQL의 스토리지 엔진은 여러 종류가 있지만 이 포스트에서는 MyISAM과 InnoDB의 차이를 설명하겠다.
MyISAM은 테이블에 ROW COUNT를 갖고 있어 SELECT count(*) 명령과 기본적인 SELECT 명령이 빠르다.
또한 Full-Text 인덱스를 지원해 검색의 효율성을 자랑한다. 그렇기 때문에 Read Only 기능이 많은 서비스에 MyISAM 엔진이 적합한 엔진이라고 할 수 있다.
그러나 Row Level Lock을 지원하지 않아, CRUD 작업이 이뤄질 때 해당 테이블 전체에 Lock이 걸리게 된다. (데이터(행)가 많아질 수록 속도는 느려짐)
<aside> 💡 따라서 MyISAM은 대규모 쓰기가 적은 웹사이트나 블로그 등에서 적합
</aside>
InnoDB는 MyISAM이 지원하지 않는 Raw Level의 Lock을 지원한다.
그러나 MyISAM이 지원하는 Full-Text 인덱스를 InnoDB는 지원하지 않는다.
<aside> 💡 따라서 대용량 데이터 처리나 트랜잭션 처리가 필요한 애플리케이션에서 적합
</aside>
위에서 간단하게 설명한 차이점을 정리해 보자면 다음 표와 같다.
| MyISAM | InnoDB | |
|---|---|---|
| 데이터 무결성 | 트랜잭션, 롤백, 로그 복구를 지원하지 않음 | 트랜잭션, 롤백, 로그 복구를 지원 |
| 속도 | 쿼리 처리 속도 및 인덱스 검색이 빠름 | 쿼리 처리 속도 및 인덱스 검색이 상대적으로 느리지만, 대용량 데이터 처리에 적합. |
| 잠금 방식 | 테이블 단위의 LOCK | 행 단위의 LOCK |
| 복구 | ACID를 준수하지 않아 복구 불가 | ACID를 준수해 복구가 가능 |
| 외래키 제약 조건 | 외래키 제약 조건 지원하지 않음 | 외래키 제약 조건 지원 |
온라인 편집샵의 주된 목적은 상품을 검색하고 보여주는 목적도 있지만 결국 모든 사용자는 상품을 구매하게 될 것이다. 추가로 효율적인 검색은 엘라스틱 서치같은 검색엔진을 도입하는 것이 마땅하다고 생각했다.
이러한 특성을 고려해 봤을 때 다수의 데이터 쓰기 작업이 이뤄진다는 점과 외래키를 이용해 다른 테이블과 관계를 맺는다는 점 등이 InnoDB를 사용하는 것으로 결정하게 되었다.