본문 바로가기

DATABASE

[Mysql] MyISAM, InnoDB, Memory 디비엔진 선택방법

1. MySQL에서 디비엔진을 선택할때의 선택 방법
이건 매우 단순한 거지만 그래도 한번 집고 넘어가주는게 나을거 같다.
알다시피 MySQL은 많은 디비 엔진을 가지고 있다. 보통 다른 DBMS를 사용하는 사람들이 가장 헷갈려 하는 부분이기도 하다(다른 DBMS만 사용하던 사람들은 이 엔진의 개념을 굉장히 생소하게 생각하더라). 간단히 사용가능한 DB 엔진을 얘기해 보면... 음.. 그냥 MySQL 깔린 사람들은 콘솔에서 show engines; 를 처보기 바란다. 나열하려니 귀찮다.

대표적인 엔진들의 선택시 고려사항에 대해서 설명하면 다음과 같다.

[MyISAM]
MyISAM은 MySQL의 가장 대표적인 엔진이다. 잘 모르는 사람들은 MySQL에는 MyISAM만 있는줄도 알더라. 이 엔진은 ISAM이라는 DB에서 발전되어 온 엔진으로 ISAM 자체가 인서트에서 매우 고성능을 발휘하던 DB 였던 만큼 MyISAM도 인서트에서 매우 훌륭한 성능을 발휘한다.
MyISAM 은 단순 인서트와 단순 셀렉트를 빈번하게 사용하는 경우에 주로 사용한다. 여기서 단순 인서트는 트랜잭션이 들어가지 않는 인서트를 말하고 단순 셀렉트는 릴레이션이 복잡하지 않은 그리고 조인이 많이 걸려있지 않은 그런 셀렉트를 말한다. 인서트의 경우는 InnoDB 보다 20% 정도 빠르다는게 일반적인 내용이다(이건 MySQL 에서 발표한거다). 또 한가지 중요한 부분이 대용량 데이터(보통 MySQL에서 말하는 대용량은 100만건 이상이라고 생각한다)가 들어가고 그 데이터에서 단건 쿼리가 아닌 여러 row를 리턴하는 쿼리가 들어가는 경우는 되도록 사용하지 말라는거다. 이유는? MyISAM은 테이블 락이 걸리기 때문이다. 테이블 락이라하면 테이블을 셀렉트할때랑 인서트 할때 테이블 전체를 락을 건다는 거다. 이거 매우 크리티컬 한 결과를 나을 수 있으므로 신중하게 생각해야만 한다. 만약 테이블 락이 전체 데이터를 넣는데 무리를 줄만하다고 판단되면 인서트 성능을 20% 정도 버리더라도 InnoDB를 선택해야 한다. 한가지 더 MyISAM의 특징은 Fulltext Index의 지원이다. 검색엔진을 사용하는 대형 회사에서야 크게 필요가 없지만, 검색엔진까지 도입하기엔 좀 벅찬 중소형 회사에서는 매우 유용하다. 특히 다른 디비에서 지원을 잘 못하는 2byte 문자에 대해서 유니코드 Fulltext를 지원하는 MySQL의 기능은 정말 유용하다. 실제로 사용해 본 결과 인덱스 크기가 좀 크긴 하지만 작동은 잘 된다. 이런 이유로 MyISAM은 보통 게시판 DB로 많이 사용이 된다.
단 MyISAM에서의 또하나의 문제점은 보통의 운영체제에서 4GB 이상의 테이블이 생성되지 않는다는 점이다. 이건 MyISAM의 문제점이 아니라, 보통의 운영체제에서의 문제점이다. 그러나 MyISAM도 한가지 해 줘야 할 부분이 있는데, avg_row_length라는것과 max_rows 라는 넘을 고쳐줘야 한다는 거다. 이건 뒤에 얘기하겠다. 암튼 4GB 가 넘는 다는건 보통 한 Row가 0.5메가 정도 되는 html 코드형 게시판 데이터라고 할 경우 8000 row를 넘지 못한다는게 되니까.. 흠.. 문제가 되기도 하겠다.

[InnoDB]
InnoDB는 일반적으로 트랜잭션이 들어가는 인서트/업데이트와 대용량 셀렉트 쿼리가 들어가는 경우 사용한다. MyISAM과 다르게 InnoDB는 Row 단위 락을 걸기 때문이라고 보면 된다.
단 앞에서도 말했듯이 인서트 성능이 20% 정도 감소된다. 보통 이런 연유로 회원디비, 빌링 등에 MySQL이 사용되면 InnoDB를 많이 사용한다.
보통은 4GB 를 넘겨야 하는 데이터일 경우에는 InnoDB를 사용하는게 일반적이다. 그러나 InnoDB도 2GB 씩 끊어서 테이블 스페이스를 잡는 것이 일반적으로 퍼포먼스가 좋다고 한다.(ITBridge 컨설팅 중)

[Memory]
Memory DB는 보통 Heap 테이블이라고 알고 있는 디비 엔진이다. 매우 빠른 인서트와 셀렉트 성능을 보인다는건 뭐 말안해도 당연할거 같아서... Heap 테이블이라고 알고 있지만 이것도 하나의 엔진으로 통하고 있다. 이 DB 역시 한계는 있는데, blob이나 text 형식의 데이터 타입을 사용할 수는 없다. 또 하나 뭐 다 아는 내용이겠지만.. 서버가 죽으면 데이터는 모두 사라진다. MySQL에서 발표한 바에 의하면 대용량 인서트시에 MyISAM보다는 33%는 InnoDB보다는 50% 정도 빠르다고 한다. 보통은 중요하지 않은 대용량 로그 데이터를 Memory에 넣은 다음에 배치로 가공하여 다른 DB로 옮기는 경우와 인증 데이터와 같이 잠시 사용하는 경우(Session 데이터에 사용하기도 한다)에 사용을 결정하곤 한다. 하지만 일반적으로 많이 쓰지는 않는다.