database

InnoDB란?

devsh247 2021. 12. 4. 19:58

InnoDB란?

  • MySQL/MariaDB의 스토리지 엔진

특징

  • 대용량 데이터를 처리할 때 최고의 성능을 낼 수 있도록 설계
  • Low Level Lock
  • 트랜잭션(commit/rollback) 제공
  • Foreign Key 지원
  • 장애 복구 가능
  • 데이터 무결성 보장
  • 정렬 가능
  • 테이블은 pk를 기준으로 클러스터링 되어 저장
  • ACID 보장

구조

Buffer Pool

  • 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두고, 쓰기 작업을 일괄 처리할 수 있게 버퍼링해주는 역할
  • 아직 디스크에 기록되지 않은 변경된 데이터인 dirty page를 가지고 있다
  • dirty page는 주기적으로 또는 체크 포인트가 발생하면 write 스레드가 필요한 만큼의 dirty page를 디스크에 기록한다

Change Buffer

  • 해당 페이지가 Buffer Pool에 없을 때, 보조 인덱스에 대한 변경 사항을 캐시하는 공간

Undo Log

  • 데이터를 변경했을 때 이전 데이터를 보관하는 장소로, 롤백 대비용으로 사용된다
  • 트랜잭션의 격리 수준을 유지하면서 높은 동시성 제공
  • 트랜잭션을 시작하고 장시간 동안 종료하지 않으면 Undo영역이 무한정 커질 수 있다
  • READ COMMITED, REPEATABLE READ, SERIALIZABLE 격리 수준에서 MVCC를 보장하기 위해, commit 이전의 데이터를 다른 사용자가 조회했을 때 Undo영역의 데이터를 반환한다
    • MVCC [ Multi Version Concurrency Control ]
      • row 단위의 트랜잭션을 지원하는 DBMS가 제공하는 기능
      • 트랜잭션에서 데이터 변경 후 commit 하기 전, 하나의 레코드는 Buffer Pool과 Undo Log에 각각 다른 버전의 데이터로 존재하게 되고, 필요에 따라 어느 데이터가 보여지는지 격리 수준 따라 달라지는 구조

Insert Buffer

  • INSERT, UPDATE 시 데이터 파일과 해당 테이블에 포함된 인덱스를 업데이트 하는 작업도 필요한데, 인덱스 페이지가 Buffer Pool 에 있지 않으면 디스크에서 읽는 작업이 필요하다. 이렇게 하면 시간이 많이 걸릴 수 있기 때문에 InnoDB는 즉시 업데이트를 실행하지 않고 Insert Buffer에 저장해두고 사용자에게 결과를 반환한다
  • 유니크 인덱스는 중복 여부를 체크해야 하기 때문에 Insert Buffer를 사용할 수 없다
  • Insert Buffer에 임시로 저장되어 있는 레코드 조각은 Insert Buffer merge thred에 의해 병합된다

Redo Log

  • ACID를 보장하기 위해 변경된 내용을 순차적으로 디스크에 기록해둔 로그 파일
  • 장애를 대비

Log Buffer

  • Redo Log 버퍼링에 사용되는 공간

Double write Buffer

  • Buffer Pool에서 flush된 페이지를 데이터 파일에 쓰기 전에 이중으로 기록해 응급 복구시 사본을 찾을 수 있다

Tablespace

  • InnoDB 스토리지 엔진을 사용하여 테이블을 생성하면 해당 테이블에 기록된 데이터와 인덱스는 파일시스템의 tablespace라는 데이터 파일에 저장된다.

System Tablespace

  • InnoDB 데이터 딕셔너리, Insert Buffer, Double write Buffer, Undo log, 그밖의 내부 구조 등을 저장하는 영역
  • 기본적으로 ibdata1이라는 단일 System Tablespace 데이터 파일이 데이터 디렉토리에 생성된다.
  • 데이터가 많아 질 경우 데이터 파일을 여러개 만들어 Disk i/o를 분산 시킬 수 있다

File-Per-Table Tablespace

  • 단일 InnoDB 테이블에 대한 데이터 및 인덱스를 포함하며 자체 데이터 파일로 저장

Temporary Tablespace

  • 사용자 생성한 임시 테이블과 내부 임시 테이블을 저장

참고

  • MySQL/MariaDB는 예전엔 스토리지 엔진으로 MyISAM을 사용했었다
    MyISAM은 테이블 단위로 Lock을 걸고, Data를 disk에서 직접 읽어온다는 특징이 있다