[mysql] 데이터베이스 InnoDB의 장점과 단점

2024. 5. 18. 15:55Back-end/Database

반응형

들어가며

회사에서 join으로 쿼리를 날려 데이터를 점검하고 있던 중 join은 정상적으로 되는데 where 절만 추가하면 모든 데이터가 조회되는 문제가 생겼다.

그런데 페이지를 이동하면 멀쩡하게 조회되는 것 아닌가???

쿼리를 잘못 날려서 생기는 문제인 줄 알고 쿼리만 30분 넘게 보고 있었는데... 알고보니 InnoDB의 단점 중 하나인 COUNT(*) 쿼리 실행 시 카운트 불일치 문제로 발생된 문제였다.

데이터는 멀쩡하게 조회가 되고 있었는데 카운트 숫자만 다르게 출력되어 죄 없는 쿼리는 잘 사용해주었다.

바로 이 놈!

나에게 삽질을 안겨줬지만, 데이터베이스 스토리지 엔진 구조라는 것에 대해 새로 알게 해준 InnoDB..

좀 더 자세히 알아보자!

 

1. Inno DB란 무엇인가?

InnoDB는 MySQL 및 MariaDB의 기본 스토리지 엔진이다.

 

그럼 기본 스토리지 엔진은 뭔데? 

스토리지 엔진은 데이터베이스 서버에서 테이블의 데이터를 저장하고 관리하는 핵심 컴포넌트(하나의 시스템이나 서비스를 구성하는 구성 요소)

MySQL/MariaDB에는 여러 가지 스토리지 엔진(MyISAM, InnoDB, Memory 등)이 있음

 

2. Inno DB의 장점

여러 가지 스토리지 엔진이 있음에도 InnoDB가 기본 스토리지 엔진으로 선택된 데에는 이유가 있다. 

 

✔️ 트랜잭션 지원: ACID 특성을 통한 데이터 일관성 및 안전한 병행 처리 보장

ACID
Atomicity(원자성) : 트랜잭션의 작업이 부분적으로 실행되지 않고 전체가 실행되거나 전체가 실행되지 않음
Consistency(일관성) : 트랜잭션이 실행되기 이전과 이후의 데이터 상태가 일관성 있게 유지됨
Isolation(고립성) : 트랜잭션 실행 중에는 다른 트랜잭션의 영향을 받지 않음
Durability(지속성) : 트랜잭션이 성공적으로 종료되면 결과가 영구적으로 저장됨

InnoDB는 이런 ACID 특성을 만족시키는 트랜잭션을 지원하여 데이터의 일관성을 보장하고, 여러 트랜잭션이 동시에 실행되도 데이터 훼손 없이 처리를 할 수 있다. 또 트랜잭션이 성공적으로 종료되면 결과는 영구적으로 저장되어 데이터 손실 위험이 없다.

✔️ 외래 키 제약: 데이터 무결성과 참조 무결성 보장
✔️ 행 수준 잠금: 동시성 처리 가능성과 안정적인 성능
✔️ 데이터 무결성 보장: 데이터베이스 서버 강제 종료 시에도 데이터 보존
✔️ 대용량 데이터 처리: 다수의 사용자 동시 접속 및 대용량 데이터 처리 가능

 

3. Inno DB의 단점

✔️ 메모리 및 디스크 사용량 증가: ACID 특성과 동시성 제어를 위한 추가 작업으로 리소스 사용량 증가

장점과 연결되는 단점으로 트랜잭션 로그, 클러스터드 인덱스 등 추가적인 공간을 필요로 하기 때문에 다른 스토리지 엔진에 비해 저장 공간 요구가 더 크다.

✔️ 갱신 작업 속도 저하: Table-level Lock 사용으로 인한 갱신 작업 속도 저하

행 레벨 잠금(Row-level Locking)이란 데이터베이스 테이블에서 특정 행(row)에 대해서만 잠금을 거는 방식
잠금의 범위가 행 단위이기 때문에 한 트랜잭션에서 특정 행을 잠그더라도 다른 트랜잭션에서는 해당 테이블의 다른 행에 접근할 수 있고, 이를 통해 여러 사용자나 프로세스가 동시에 같은 테이블에 접근하는 경우에도 처리 능력이 향상된다.

InnoDB에서 행 레벨 잠금(Row-level Locking)을 사용하는 주된 이유는 동시성(Concurrency)을 높이기 위해서인데 이로인해 속도가 저하될 수 있다.

✔️ 데이터 복구 미흡: MyISAM에 비해 복잡한 메커니즘을 사용하여 상대적으로 데이터 복구가 어려움

✔️ COUNT(*) 쿼리 실행 시 카운트 불일치 문제

 InnoDB는 트랜잭션 처리 과정에서 데이터 변경 사항을 즉시 반영하지 않고, 버퍼링하여 일괄 처리하기 때문에 COUNT(*) 쿼리 실행 시 버퍼링된 데이터만 반영되어 실제 행 수와 다른 결과가 나타날 수 있다.

 

4. 정리

InnoDB는 데이터 무결성 보장이 중요한 애플리케이션에 적합한 스토리지 엔진이며, 트랜잭션 처리와 외래키 지원 등의 기능을 통해 데이터 일관성과 참조 무결성을 유지할 수 있다.

반응형
top
bottom