본문 바로가기

프로그래밍/Database

[MySQL] MyISAM과 InnoDB_MySQL storage engine

반응형

 

2020/05/09 - [프로그래밍/Database] - [MySQL] Lock wait timeout exceeded

 

[MySQL] Lock wait timeout exceeded

기존에 정상적으로 동작하던 API에서 간헐적으로 Timeout Error가 발생하기 시작했다. Cloudwatch Log에서 다음과 같은 에러 메시지를 확인하였고, 외부 연동 포인트가 아닌 DB에서 발생한 문제 임을 알��

jaenjoy.tistory.com

지난 Lock wait timeout exceeded 포스팅에서 언급한 적이 있던 innodb에 대해 설명해보고자 한다.

 

Storage Engine

스토리지 엔진(Storage Engine)이란 물리적 저장장치에서 데이터를 읽어오는 역할을 담당하는 부분이다.

"데이터를 읽어오는 역할" 즉, 데이터를 직접적으로 다루는 부분으로서 각 엔진마다 그 동작 방식에 있어서 차이가 있다.

대표적으로 Transaction이나 읽기 성능과 같은 부분에서 차이가 있는 부분이다.

 

SHOW ENGINES;

위의 명령으로 DB에 탑재된 Storage Engine을 확인할 수 있으며, 결과는 아래와 같이 나타난다.

SHOW ENGINES @Data Grip

글의 제목에서 언급한 MyISAM(위 사진에서 idx 5)과 InnoDB(idx 7)는 MySQL의 Storage Engine에서 가장 많이 사용되는 2가지 이다.

 

MyISAM

MyISAM 엔진은 Read Only 기능이 많은 서비스에 대해서 장점을 갖는다.

즉, Select에 대한 작업 속도가 빨라서 읽기 작업에 효과적이다.

 

구체적으로 설명을 덧붙이자면,

MyISAM은 항상 테이블에 Row Count를 갖고 있기 때문에 SELECT count(*) 명령에 대한 응답이 빠르고,

Full Text Indexing이 가능하기 때문에 검색하고자 하는 내용에 대한 복합 검색이 가능하다.

Full Text Index는 자연어를 기반으로 검색할 수 있는 인덱스로 데이터 조회에 있어서 효과적인 수단으로 활용할 수 있다.

 

하지만 단점으로는 다음의 두 가지가 있다.

Table Level Locking을 사용하기 때문에 INSERT나 UPDATE 시, row의 수가 커질수록 속도가 느려지는 단점이 있다.

query를 실행할 때 해당 Table 전체를 Lock하기 때문에 발생하는 이슈이다.

 

또한, 데이터 무결성, 일관성(Consistency)이 보장되지 않는 문제도 있다.

Transaction에 대한 지원이 되지 않기 때문에 DB 레벨에서의 데이터 일관성을 기대할 수 없고, 개별 Code 레벨에서 데이터 일관성을 처리해야 한다.

InnoDB

MyISAM과 달리 Transaction을 지원하는 엔진이다.

따라서 Commit, Rollback 등의 처리가 가능하여 data의 일관성에 대해서는 DB에 일임할 수 있다는 장점이 있다.

 

또한 Row Level Locking이 지원되기 때문에 CRUD가 많은 서비스를 빠르게 처리할 수 있다는 장점이 있다.

위에서 언급한 Transaction 처리와 함께 대용량의 데이터를 핸들링하는 것에도 부담이 없는 Storage Engine이다.

 

하지만 다양한 기능(Foreign Key 등)이 지원되는 만큼 DB Modeling 과정에서 고려해야 하는 변수가 많고,

Transaction의 처리 등 Code Level에서 신경써서 구현해야 하는 부분도 많다.

 

추가적으로 MyISAM의 큰 장점 중 하나였던 Full Text Index가 지원되지 않는 점은 단점 중 하나이다.


MyISAM과 InnoDB는 상반되는 특징을 갖는 Storage Engine이다.

 

저장된 데이터를 조회하는 데에 서비스가 집중되어 있는지

아니면 데이터의 입력과 수정 등의 변경 작업이 빈번하게 일어나는 서비스에 대한 DB인지에 따라 어떤 스토리지 엔진을 사용할 지 결정될 것 이다.

 

물론 두 종류의 Storage Engine을 함께 사용할 수는 있지만,

기본적인 동작 방식에 있어서 차이가 있기 때문에 Data Backup이나, Query 시의 Join, DB Lock과 같은 부분에서 어려움이 생길 수 있다.

반응형