kimyu0218
  • [mysql] InnoDB 살펴보기 (장점/ACID/MVCC)
    2024년 02월 03일 21시 00분 45초에 업로드 된 글입니다.
    작성자: @kimyu0218

    InnoDB란?

    InnoDB는 mysql에서 사용되는 기본 스토리지 엔진으로, 데이터베이스 테이블을 관리하는 데 사용된다.

    Buffer Pool, Chage Buffer, Doublewrite Buffer, Undo Tablespaces 확인하기

     

    InnoDB의 장점

    어떤 장점이 있길래 InnoDB를 스토리지 엔진으로 사용하는 걸까?

    • InnoDB Recovery - 하드웨어나 소프트웨어 이슈로 서버가 예기치 못하게 종료되어도 InnoDB의 crash recovery가 자동으로 수정을 마무리한다.
    • Buffer Pool - 버퍼 풀*에 테이블과 인덱스를 캐시하여 자주 사용하는 데이터는 메모리에서 처리한다.
    • Index - 레코드에 를 설정하면 해당 컬럼을 활용한 연산들을 자동으로 최적화한다.
    • Change Buffer - 체인지 버퍼*를 이용하여 삽입, 수정, 삭제 작업을 최적화한다.

    위의 장점 외에도 정말 많은 장점들이 있다. 자세한 사항은 여기에서 확인할 수 있다.

    *버퍼 풀 : 테이블과 인덱스에 대한 캐싱을 수행하는 영역으로, 자주 액세스되는 데이터를 메모리에서 읽어오기 때문에 처리 속도가 빠르다. 데이터베이스 성능을 향상시키는 데 핵심적인 역할을 수행하므로 튜닝의 중요한 부분이다.
    *체인지 버퍼 : 버퍼 풀에 없는 보조 인덱스 페이지의 변경사항을 캐싱하는 곳이다. 변경사항들은 읽기 작업에 의해 페이지가 버퍼 풀에 로드될 때 적용되므로 디스크 I/O 작업을 기다리지 않고도 변경된 내용을 확인할 수 있다.

    ACID

    ACID란 Atomicity, Consistency, Isolation, Durability의 약어로, 트랜잭션* 개념과 깊게 연관되어 있다. InnoDB 스토리지 엔진은 ACID 모델을 준수하기 때문에 데이터베이스에서 일어나는 모든 작업을 안정적이고 일관된 상태로 유지한다.

    *트랜잭션 : 커밋/롤백될 수 있는 작업의 단위

     

    Atomicity

    트랜잭션이 커밋되면 해당 작업에서 가한 모든 변경사항이 데이터베이스에 성공적으로 반영되고, 중간에 문제가 생겨 롤백하면 모든 변경 사항이 취소되어 이전의 일관된 상태로 돌아간다. 즉, 트랜잭션이 성공했을 때만 결과를 반영하고 실패 시에는 아무런 영향을 미치지 않도록 하여 데이터베이스를 일관된 상태로 유지한다.
     

    Consistency

    데이터베이스는 언제나 일관된 상태를 유지한다.
     

    Isolation

    트랜잭션은 다른 트랜잭션 연산에 영향을 미치지 않는다. 이를 보장하기 위해 데이터베이스는 로킹을 사용하여 다른 트랜잭션의 간섭을 방지한다. 즉, 트랜잭션이 데이터를 조작하는 동안 다른 트랜잭션은 해당 데이터에 대한 변경을 알 수 없고 이로써 데이터의 일관성을 유지한다.
     

    Durability

    한 번 커밋된 작업은 시스템에 영구적으로 반영된다. 데이터는 주로 디스크에 기록되는데 시스템 장애로부터 보호하기 위해 여분의 복사본을 두고 있다. InnoDB의 경우, doublewrite buffer*로 지속성을 보장한다.

    *doublewrite buffer : 변경사항이 발생했을 때, 디스크에 저장하기 전에 먼저 doublewrite buffer에 기록한다. 디스크에 기록하는 도중에 시스템 장애가 발생하더라도 doublewrite buffer에서 복사본을 찾을 수 있다.

    Multi-Versioning (MVCC)

    InnoDB는 동시성과 트랜잭션의 롤백 기능을 지원하기 위해 변경된 행의 이전 버전에 대한 정보를 유지한다. 해당 정보는 롤백 세그먼트의 undo tablespace에 저장된다. 즉, 트랜잭션이 데이터를 변경하면 InnoDB는 변경 전의 내용을 롤백 세그먼트에 저장한다. 이는 트랜잭션이 롤백되어야 할 때 이전 상태로 데이터를 복원하는 데 사용된다.
     
    내부적으로 InnoDB는 레코드마다 세 개의 필드를 추가한다.

    1. `DB_TRX_ID` : (트랜잭션 식별자) 레코드를 마지막으로 수정한 트랜잭션의 ID를 기록한다.
    2. `DB_ROLL_PTR` : (roll pointer) 롤백 세그먼트에 기록된 undo log 레코드를 가리킨다. undo log 레코드는 업데이트 되기 전의 내용을 복원하는 데 필요한 정보가 들어있다.
    3. `DB_ROW_ID` : (행 식별자) 새로운 행이 삽입될 때마다 증가하는 ID다.

    참고자료

    댓글