DB 엔진 – MyISAM, InnoDB의 장단점과 차이점

가장 넓리 사용되는 Storage Engine 중 MyISAM과 InnoDB를 빼놓을 수는 없다. 각각의 장점과 단점, 그리고 가장 큰 차이점은 무엇인지 알아보도록 하자.

먼저 일반적인 기업에서는 아무래도 복구 등의 기능을 가진 트랜잭션(Transaction)이 매우 중요하기 때문에 InnoDB를 사용하는 곳이 많다. 특히 쇼핑몰처럼 많은 쿼리가 발생할 경우 InnoDB를 선호한다.

1. MyISAM

  1. 예전의 MySQL 의 Storage Engines 으로 MyISAM 을 사용했었다.
    (예를 들면 블로그 라던지, 게시판 처럼 한사람이 글 쓰면 다른 많은 사람들이 최적의 성능을 발휘한다. 지금도 많이 사용하는 엔진중 하나)
  2. 제공하는 웹서비스가 그닥 크지 않다면 괜찮은 선택

MyISAM 특징
– ISAM의 업그레이드된 엔진임
– 단순한 기능을 제공하는 대신 빠른 속도를 제공한다. (특히 Select문 반복사용시)
– 무결성에 대한 보장이 되지 않는다.
– 풀텍스트 인덱싱이 가능하다.
– 테이블 단위의 락이 이루어짐

2. InnoDB

  1. 트랜잭션 – 세이프 스토리지 엔진
  2. MyISAM 과 비슷하지만 ORACLE처럼 많은 기능을 지원함(commit, rollback, 장애복구, row-level locking, 외래키 등)
  3. 다수의 사용자 동시접속과 퍼포먼스가 증가하여 대용량 데이터를 처리할 때 최대의 퍼포먼스를 내도록 설계됨
  4. CPU 효율은 어느 디스크 기반의 데이터 베이스와 비교해도 손색이 없고, 자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼풀(pool)을 관리함
  5. 테이블과 인덱스를 테이블 스페이스에 저장을 하고 테이블 스페이스는 몇개의 서버파일이나 디스크 파티션으로 구성되어있음. 이게 MyISAM과 다른점인데, MyISAM은 테이블과 인덱스를 각각 분리된 파일로 관리함
    (InnoDB를 제대로 사용하기 위해서는 테이블 스페이스라는 개념을 파악해야함)
  6. InnoDB 테이블은 OS의 파일 사이즈 한계가 2GB이더라도 상관없이 어느 크기나 가질수 있음
  7. InnoDB는 높은 퍼포먼스가 필요한 대용량 사이트에 적합

InnoDB 특징
– 다양한 트랜젝션(Transaction) 기능을 제공한다. 커밋, 롤백, 외래키등의 사용이 가능하다.
– 조회보다는 쓰기, 수정등의 변경작업이 상대적으로 빠르다.
– 무결성 보장이 된다.
– 로우 단위의 락이 이루어짐

InnoDB 사용하기

  1. InnoDB는 MyISAM 과 공유하는 메모리도 있지만 별도의 버퍼풀을 가지고있으니까 InnoDB 전용 DB를 구성한다면 MyISAM 이 사용하는 record_buffer과 key_buffer에 너무 많은 메모리를 할당할 필요가 없음
  2. InnoDB 설정
    • MySql을 설치한 폴더 아래에 ibdata와 iblogs 폴더를 생성
    • my.ini 파일 설정을 변경
      • innodb_buffer_pool_size : 현재 자신의 시스템 메모리의 50~80% 사이로 만듬 (x86 시스템에서는 2G이상 설정할 수 없음)
      • innodb_additional_mem_pool_size: 데이터 사전정보나 내부의 데이터 구조 정보를 담는 메모리. (보통 2M 정도 잡아주면되고, 아주 많은 테이블을 사용한다면 조금 더 늘리면 됨)
        • 메모리 공장이 부족하면 error log에 경고 메세지를 남기니 그때 늘리면 됨
      • innodb_flush_log_at_trx_commit : insert, update 등 데이터 삽입과 관련있음.
        • commit을 하였을때 그 즉시 커밋된 데이터를 로그에 기록할지 안할지 설정
        • 로그 파일을 기록할 경우 갑작스러운 경우 데이터 손실을 막을 수 있지만, 매번 로그를 기록하므로 속도 저하
        • 1일 경우 기록, 0일 경우 기록 안함
      • innodb_log_file_size : 트랜잭션을 기록하는 로그 파일의 크기를 결정
        • inno_buffor_pool_size 옵션은 성능을 위한것이지만 시스템이 다운되었을 경우, 데이터가 손실되므로 이것을 방지하기 위해 로그파일을 만들어서 commit 될때마다 로그에 기억을 하고 자동 복구를 함
        • 로그 파일은 무한정 계속 커지는게 아니라 일정한 크기와 갯수를 가지고 순환식으로 처리되므로 inno_buffer_pool_size의 15% 정도로 설정하는걸 추천 ( ex. 만약 메모리가 1기가이면 inno_buffer_pool_size = 512M, innodb_log_file_size = 80M)
      • innodb_log_buffer_size : 로그 파일을 기록하기 위한 버퍼 사이즈
        • 트랜잭션이 작거나 거의 없다면 크게 잡는것은 낭비이므로 보통 1M ~ 8M 사이로 설정
    • my.ini 수정 후 , mysql 재시작
  3. innoDB 테이블 만들기
    • create table test_inno(

      )type=innodb;
  4. InnoDB 트랜잭션 사용
    • 트랜잭션을 사용하기 위해서는 처음에 set autocommit = 0; 이나 begin; 을 선언해야함
    • 선언후 데이터 변경이 있을때, 이상이 없을 경우 커밋, 이상이 있을경우 롤백 (오라클이랑 비슷)

1. InnoDB이 유리한 경우

  • 대용량의 데이터를 컨트롤 하는 경우
  • 트랜잭션 관리가 필요한 경우
  • 복구가 필요할 경우
  • 정렬등의 구문이 들어가는 경우
  • IUD 등이 빈번하게 발생하는 경우(Row-Level locking 때문에)

=> 즉, 정보 업데이트가 잦거나 정보 유실에 대해 민감한 경우 (리스키 한경우)

2. MyISAM이 유리한 경우

  • 읽기 위주의 작업만 필요할 경우
  • 전문 검색이 필요할 경우
  • 트랜잭션이나 복구등이 필요 없을 경우
  • 한번에 대량의 데이터를 입력하는 배치성 테이블

=> 즉, select가 월등하게 많이 일어나는 경우에 유리. 속도가 빠름.