[MySQL] - InnoDB vs MyISAM & 5.7 vs 8.0

devdo·2022년 8월 14일
1

MySQL

목록 보기
2/7
post-thumbnail

InnoDB

InnoDB는 사용자의 데이터를 보호하고 내결함성을 제공하는 commit, rollback 및 충돌 복구 기능과 같은 기능을 갖춘 MySQL용 transaction-safe (ACID 호환)스토리지 엔진이다.
row-level locking을 사용하며 MVCC/Snapshot read(non-locking 읽기 방식)으로 다중 사용자의 동시성과 성능을 향상시킨다.

InnoDB는 일반 쿼리에 대한 I/O를 줄이기 위해 Primary key를 기반으로 클러스터형 인덱스에 사용자 데이터를 저장한다. 또한 데이터 무결성을 유지하기 위해 Foreign key 참조 무결성 제약 조건도 지원한다.


MyISAM

MyISAMMy Indexed Sequential Access Method의 약어로 웹, 데이터 웨어하우징 및 기타 분석 환경에서 자주 사용된다.
MyISAM 스토리지 엔진은 모든 MySQL 구성을 지원한다.
2009년 12월까지 기본 스토리지 엔진이었으며, MySQL 5.5부터 기본 스토리지 엔진로 InnoDB로 기본 엔진이 변경되었다.
ISAM 알고리즘을 기반으로 하며 대용량 데이터에 빠르게 응답한다.

MyISAM은 최소한의 데이터에 대한 이력을 가지므로 데이터 웨어하우징 및 웹 애플리케이션에 더 적합하다.


그래서 차이는?

이제 MyISAM과 InnoDB에 대해 기본적인 이해를 가졌으니 하나하나 두 엔진의 차이점을 알아보자.

Engine Type

MyISAMnon-transactional 스토리지 타입이며 롤백이 필요한 경우 수동으로 처리해야 한다.

InnoDBtransaction 스토리지 타입으로 롤백이 필요한 경우 자동으로 롤백이 된다.


1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

4 단계에서 프로세스가 충돌한다고 가정합시다. 여기에 InnoDB 테이블이 사용 된 경우, 롤백을 수행하면 변경 사항이 취소되고 손실 위험에서 벗어날 수 있습니다. 말 그대로, 테이블은 5 단계가 성공적으로 실행되지 않으면 변경 사항이 테이블에 커밋되지 않으므로 충돌을 인식하지 못합니다.

그러나 MyISAM 테이블의 경우 롤백이 호출되거나 트랜잭션 실패로 이어지는 충돌이 발생하면 트랜잭션 변경 사항을 취소 할 수 없습니다. 즉, 3 단계에서 거래가 중단되면 당좌 예금 계좌에서 돈이 공제됩니다. 그러나 돈은 저축 계좌에 추가되지 않았을 것입니다.

출처: http://daplus.net/mysql-mysql%EC%9D%98-innodb-%EB%B0%8F-myisam%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C/


Locking

MySQL의 locking은 두 사용자가 하나의 행을 동시에 수정하는 것을 방지하기 위해 테이블을 잠그는 메커니즘으로 race condition을 방지하기 위해 사용된다.

MyISAM은 기본적인 table locking method를 사용하고 단일 세션에서 테이블을 수정할 수 있도록 한다. 즉 하나의 사용자만 테이블을 바꿀 수 있다. 만약 다른 사용자가 테이블을 바꾸려 시도한다면, 테이블이 잠겼다는 응답을 받게 된다. table locking method는 많은 메모리를 요구하지 않기 때문에 읽기 전용 데이터베이스에 유용하다.

InnoDB는 테이블의 row-level locking method를 사용한다. 이 메서드는 수정 프로세스에서 테이블의 행만 잠그는 방식으로 동일한 행에 다중 세션 접근을 지원한다. row-level locking은 다중 사용자가 접근하는 데이터베이스에 유용하다. 다만 많은 메모리를 필요로 하며, 조회와 데이터 수정에 대해 시간이 걸린다는 단점이 있다.

Foreign Key

외래 키는 테이블 데이터를 다른 테이블에 연결하는 열로, 두 데이블 간 연결된 내용과 다른 레코드를 추가하는 것을 방지한다.

MyISAM은 외래 키를 지원하지 않는다. 하지만
InnoDB는 외래 키를 지원한다.

ACID properties

ACID는 원자성(Atomicity), 일관성(Consistency), 고립성(Isolation), 지속성(Durability)의 약자로 데이터베이스 transaction이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리킨다.

MyISAM은 ACID 성질을 지원하지 않지만
InnoDB는 지원한다.

성능

MyISAM은 transaction 속성을 지원하지 않고 읽기 속도가 빠르다. InnoDB와 비교해 보면 대용량 데이터에서 성능이 떨어진다.

InnoDB는 rollbacks, commit 등 transaction 속성을 지원하고 쓰기 속도가 빠르다. InnoDB은 대용량 데이터에서 MyISAM보다 좋은 성능을 갖는다.

Reliability

MyISAM은 데이터 무결성을 제공하지 않는다. 하드웨어 오류 및 취소된 작업으로 인해 데이터가 손상될 수 있다.

InnoDB는 transaction log를 사용해 모든 작업을 기록하므로 신뢰할 수 있다. 따라서 장애 발생 시 로그를 사용해 빠르게 복구할 수 있다.

Caching and Indexing

MyISAM의 버퍼는 인덱싱 전용이다. 또한 full-text search를 지원한다.

InnoDB는 큰 버퍼 풀을 지원해 데이터와 인덱스를 캐싱할 수 있다. 하지만 full-text search에는 지원하지 않고 인덱스 알고리즘으로 B-tree를 쓰고 있다.


Conclusion

MyISAM은 안정적인 장애 복구를 지원하지 않으며, 테이블이 손상될 수 있다.
InnoDB는 장애 발생 시 로그를 통해 복구를 할 수 있다. 때문에 RDS(MySQL)에서 InnoDB만 자동 백업을 지원한다는 것을 알 수 있다.


버전별 성능 차이

Mysql 5.5 vs 5.7

Mysql 5.7 vs 8.0

이글을 참고해주길 바란다. 성능적으로 많이 차이가 난다.



출처

profile
배운 것을 기록합니다.

0개의 댓글