스토리지 엔진 레벨에서의 접근법

Posted on July 22nd, 2021

시작

책에 있는 순서로 보면 '스토리지 엔진 레벨에서의 접근법'은 맨 마지막에 있는 목차이다. 그럼에도 불구하고 이 마지막 부분을 먼저 공부하는 이유는 페이지 수가 적기 때문이다. 오늘은 충전도 같이 해줘야하는 날이기에 타협을 봤다.

InnoDB 가 짱? 다른 스토리지 엔진은?

무조건 InnoDB가 짱일까? 책을 보며 확인해보자. InnoDB는 행단위 잠금으로 데이터를 처리한다. 우선 여기서 말하는 '잠금'이라는 것은 여러 트랜잭션이 동시에 동일한 Data에 접근하는 경우에 서로의 연산들이 동시성에 문제가 될 수 있으므로 간섭하지 않게 제어하는 기법이다.

MySQL InnoDB 같은 경우에는 행단위 잠금이므로 여러 세션의 동시 쓰기 엑세를 지원하고 그러므로 다중 사용자, 동시성이 높은 OLTP 애플리케이션에 적합하다고 할 수 있다.

여기서 또 'OLTP'는 여러 사용자가 실시간으로 DB Data를 갱신, 조회하는 단위 작업 처리하는 방식이다.

더 나아가 InnoDB 같은 경우에는 인덱스와 더불어 데이터까지 버퍼풀에 저장하기 때문에 모든 데이터가 메모리에 있으면 디스크를 읽지 않아도 되므로 강력한 성능을 발휘한다.

뭐 아무튼.. InnoDB가 이러한 장점이 있다면 단점 또한 존재하는데 그 단점을 말하고자 한다.

1. 인덱스와 데이터 모두 메모리에 적재되므로 메모리 사용 효율에 좋지 않다.
2. 보조 인덱스 같은 경우도 데이터를 찾아가는 Key를 갖고 있기에 인덱스 사이즈 자체가 커질 수 있으므로 메모리 사용 효율에 좋지 않다.

즉, 단점의 결론은 메모리 때문에 로그 수집에 대한 용도로 InnoDB를 쓰는 것은 바보같은 짓이다.

그럼 로그를 수집하는 프로젝트에서 어떤 스토리지엔진을 쓰면 좋을까? 전에 쓰던 글에도 써있지만 Archive 스토리지 엔진은 행 단위 잠금이며 데이터를 압축하며 디스크에 저장하기 때문에 적합한 스토리지 엔진이다. 다만, 인덱스를 생성할 수 없으며 UPDATE/DELETE를 사용할 수없기에 이런 부분에서의 기능이 필요하다면 MyISAM을 쓰는 것을 권장한다.

MyISAM같은 경우는 행단위 잠금이 아니라 테이블 단위 잠금이기에 동시성에 문제가 생기므로 동시 서비스에는 적합하지 않지만, 저사양 서버에서 사용하기 위해 고안된 스토리지 엔진이기에 메모리 측면에서 좋은 선택지가 될 수 있다.

즉, 정리해보자.

  • MyISAM vs Archive

정말 로그 수집만을 위한 프로젝트인 경우 ( UPDATE/DELETE 가 필요로 없는 경우 ) Archive 스토리지 엔진을 쓰고 만약, 로그 수집이지만 UPDATE/DELETE가 필요하다면 MyISAM 스토리지 엔진을 쓰는 것이 좋은 선택지다.

  • InnoDB vs MyISAM

로그 수집이 목적이 아니며 읽기 전용이면 MyISAM 스토리지 엔진을 쓰고 그것이 아니라면 동시처리, 트랜잭션을 고려해야 하는 경우 InnoDB. 그것이 아니라면 MyISAM을 쓰면 된다.

InnoDB를 사용한다면 Barracuda 파일 포맷 고려해보자.

우선 전제는 MySQL 5.5 버전이상이여야한다. InnoDB 파일 포맷인 Barracuda을 사용한다면 데이터 저장 공간을 크게 절약할 수 있다. Dynamic, Compressed 로 저장할 수 있는 형식이 있는데 이 부분은 깊게 다루지 않겠다. 간단하게 말하자면 데이터를 압축하며 저장 공간을 절약할 수 있는 느낌만 알고 가자. EX. 버퍼풀이 24GB지만 내부적으로 40GB처럼 사용할 수있다는 것.

책에 나와있는 필자의 경험에는 Amazon RDS에서 Barracuda Format을 이용하여 디스크 사용 효율을 높인 경험이 있다고 한다. 즉, 메모리가 무궁무진하며 되게 크다면 사용할 일이 없겠지만, 제한된 메모리 크기를 극복하고자 한다면 Barracuda를 고려해볼만 하다.

마치며

항상 우리는 공부하면서 MySQL은 곧 InnoDB와 같은 느낌으로 공부를 했다. 너무나도 당연시되는 느낌이랄까. 아무 문제 없는 평범한 일상속에서의 실력이 아닌 예상하지 못한 상황에서 실력을 발휘하는 것이 진정한 개발자라고 생각한다. 지금 나의 기준 그리고 나의 위치에서 성능에 있어서 문제가 생겼을 때, InnoDB가 아닌 다른 스토리지 엔진을 쓰면 되지않을까? 하는 생각이 나게끔 공부를 하는 것은 좋은 방향성이라고 생각한다.


참고 : 실무 예제로 다가가는 MySQL 쿼리작성 MySQL 퍼포먼스 최적화 - 성동찬, 한빛미디어