What - InnoDB, MyISAM
모두 mysql 에서 지원하는 엔진 구조입니다.
차이점
- 트랜잭션 지원 유무의 차이(데이터 일관성과 연관있음)
- 5.5 버전 이후 자동으로 InnoDB 엔진으로 구성됩니다.
- 파일 관리
- MyISAM은 인덱스와 테이블을 각각 분리된 파일로 관리합니다.
- 이에반해 InnoDB는 인덱스와 테이블 모두 테이블 스페이스에 저장하고 테이블 스페이스의 몇개는 서버파일이나 디스크 파티션으로 구성하고 있습니다.
사용시점 및 적합도
- InnoDB - 데이터 일관성을 보장하기 위한 서비스
- MyISAM - 조회가 많이 일어나는 서비스
InnoDB
- 트랜잭션 세이프 구조입니다.
- 2단계 격리 레벨에서도 유령 레코드 사입의 문제가 발생하지 않습니다.
- 일정 부분의 영역에 Record Lock 거는 GAP LOCK을 지원하기 때문입니다.
MyISAM
- 비 트랜잭션 세이프 구조입니다.
- 풀텍스트 인덱스를 지원하기 때문에 조회가 많이 일어나는 서비스에 성능향상을 기대할 수 있습니다.
- 테이블에 ROW_COUNT를 가지고 있기 때문에 select count(*) 명령시 빠릅니다.
Why - 왜 버젼별 차이를 알아야 하는가?
- 각각 파일 관리나 트랜잭션 유무의 차이를 갖는 특성을 알아야 어떤 서비스에 적합한지 기술을 선택할 수 있는 척도가 될 수 있습니다.
- 지극히 개인적으로 master-slave 구조로 master → InnoDB로, slave → MyISAM을 통해 혼용해서 사용하면 읽기 연산 요청에 좀더 성능향상을 기대해볼 수 있을 것 같다고 생각합니다.
- 그래서 밑에 예제를 통해 한번 실험해보려고 합니다.
How - MyISAM, InnoDB Replication 구성하고 테스트 해보기
- docker를 활용한 인프라 셋팅 (replication)
- 내부로 들어가 엔진 구조 확인해보기
파일 트리 구조

compose 파일
version: '3.8' networks: default: name: test-database volumes: data: driver: local config: driver: local services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: testdb TZ: Asia/Seoul volumes: - ./master/my.cnf:/etc/mysql/my.cnf - ./master/data:/var/lib/mysql - ./master/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "3306:3306" mysql-slave-1: image: mysql:8.0 container_name: mysql-slave-1 environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: testdb TZ: Asia/Seoul volumes: - ./slave/my.cnf:/etc/mysql/my.cnf - ./slave/init.sql:/docker-entrypoint-initdb.d/init.sql ports: - "3307:3306" depends_on: - mysql-master
maseter 패키지 파일
init.sql
create user 'slave_user'@'%' identified by 'password'; grant replication slave on *.* to 'slave_user'@'%' with grant option; flush privileges;
conf 파일
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 1 log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = testdb gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
slave 패키지 파일
init.sql
CHANGE MASTER TO MASTER_HOST='mysql-master',MASTER_USER='slave_user',MASTER_PASSWORD='password',MASTER_AUTO_POSITION=1; START SLAVE;
conf 파일
[mysqld] default-storage-engine = MYISAM pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL symbolic-links=0 default_authentication_plugin=mysql_native_password bind-address = 0.0.0.0 server-id = 2 relay-log = /var/run/mysqld/mysql-relay-bin.log log_bin = /var/run/mysqld/mysql-bin.log binlog_do_db = testdb read_only = on gtid_mode = on enforce_gtid_consistency = on log_slave_updates = on
엔진구조 확인해보기 (docker 내부로 들어가서 확인)
docker exec -it ${master pid} /bin/bash mysql -u root -p password: ${password 입력} ---- mysql 진입완료!! --- SHOW VARIABLES LIKE 'default_storage_engine';

성능테스트 해보기 (InnoDB READ 일 경우, MyISAM READ 일 경우)
ready…