내용

글번호 600
작성자 heojk
작성일 2017-02-15 18:30:48
제목 MySQL 데이터베이스의 엔진 MyISAM, InnoDB, Memory 비교
내용 MySQL에는 그 특성에 따라 여러 종류의 데이터베이스 엔진(스토리지 엔진 이라고도 함)이 존재합니다. 가장 많이 알려져 있고 또 가장 많이 사용하고 있는 엔진은 MyISAM과 InnoDB일텐데요, 그전 까지는 MyISAM이 MySQL의 기본 엔진이었다면 MySQL 5.5부터는 InnoDB가 기본 엔진으로 바뀌었습니다. 거의 대부분의 사람들이 기본 설정을 사용하기 때문에 여지껏 MyISAM을 많이 사용했을 겁니다. 타사의 상용 데이터베이스를 써보고 MySQL 별로네 하는 생각을 해봤다면 엔진을 바꿔 적용해볼 필요가 있을 것 같습니다. InnoDB의 특징 트랜젝션 지원 빈번한 쓰기, 수정, 삭제시 처리 능력 디스크, 전원 등의 장애 발생시 복구 성능 동시처리가 많은 환경에 적합 Row 단위 락킹 MyISAM의 특징 상대적으로 높은 성능 읽기 위주의 요청에 유리 테이블 단위 락킹 사실 여러면에서 InnoDB가 좋지만 성능면에서 MyISAM이 더 좋고, MySQL이 프리웨어 데이터베이스로 많이 활용되면서 웹 게시판과 같은 단일 트랜젝서 환경 또는 대규모 동시 처리에 대한 요구가 없는 환경에서 사용되다 보니 기본 엔진이 MyISAM이 제격이었을 겁니다. 그러다 Oracle에 인수 된 이후 엔터프라이즈 용으로도 많이 사용되면서 InnoDB가 더 각광을 받게 됐을지도 모르겠네요. MyISAM은 트랜젝션 지원이 안되기 때문에 여러 SQL문을 실행한 후 commit 또는 rollback 하는 기능이 없고, 테이블 단위로 락이 걸리기 때문에 테이블에 두 가지 이상의 데이터를 동시에 insert/update할 수 없습니다. 대신 기준정보 테이블 처럼 데이터가 거의 고정되어 있고 읽기가 많이 발생하는 경우에는 그 성능 효과를 충분히 발휘할 수 있습니다. 회사의 조직도는 주로 LDAP에 저장하겠지만, MySQL을 사용한다면 InnoDB보다는 MyISAM엔젠이 적합하겠네요. 다행인 것은, MySQL 인스턴스 안에 두 가지 엔진을 섞어 쓸 수 있습니다. 테이블을 생성할 때 지정해주면 되는데요, CREATE TABLE company_org (org_code INT, org_name CHAR (100)) ENGINE=InnoDB; 물론 5.5 부터는 기본 엔진이 InnoDB 니까 안써줘도 되겠고, MyISAM은 "ENGINE = MYISAM"으로 지정하면 됩니다. 참고로, MySQL도 Tibero나 Altibase와 같이 메모리 데이터베이스로 사용할 수 있습니다. MySQL에 메모리DB가 어딧냐고 우기시는 분들이 있기도 한데요, 실제 공공기관에 구축해서 고성능(?)을 발휘한 사례가 있습니다. x86 서버에 허용하는 최대 메모리를 꽂아놓고 약 8~90GB에 달하는 데이터를 메모리에 올려 서비스했었습니다. 테이블 생성시 주는 옵션과 똑같고 엔진 타입만 'MEMORY' 또는 'HEAP'이라고 지정합니다. CREATE TABLE company_org (org_code INT, org_name CHAR (100)) ENGINE=MEMORY; Hash 인덱스를 기본으로 사용해 아주 빠르고, 당연히 서버가 다운되면 데이터는 날라 갑니다. (테이블 스키마는 남아요) 임시 테이블이나 고정 데이터용으로 적합하고, 데이터 전체를 파일로 보관했다가 DB가 재시작할 때 로드할 수 있게 하거나, 혹은 Master-Slave로 구성하여 Master가 재시작할 때 Slave의 데이터를 동기화 하는 벙법이 있습니다.