InnoDB Storage Engine 특성 및 구조
[MySQL 운영]/MySQL basic 2021. 1. 29. 15:04 |# InnoDB 스토리지 엔진 특성
- InnoDB의 모든 테이블은 pk 를 기준으로 클러스터링되어 저장된다.
- InnoDB는 락을 걸지 않고 읽기 작업을 수행하기 때문에, 다른 트랜잭션이 갖고 있는 락을 기다리지 않고 Read가 가능하다. (잠금없는 일관된 읽기)
- InnoDB는 데드락이 발생함과 동시에 바로 감지되고, 감지된 데드락은 관련 트랜잭션 중 ROLLBACK 했을 때 복구 작업이 가장 적은 트랜잭션(레코드를 가장 적게 변경한 트랜잭션)을 자동으로 강제 종료한다.
- InnoDB는 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 데이터페이지 등에 대한 복구 작업이 자동으로 진행된다. (‘innodb_force_recovery’ : 각 설정 값에 따라 손상을 복구하면서 스토리지 엔진을 강제로 시작해주는 옵션)
- Row 수준의 잠금이 걸리기 때문에, 변경작업(insert/update/delete) 속도가 MyISAM보다 상대적으로 빠르다.
- 외래키(FK)를 지원하여 데이터 무결성을 유지한다.
- 트랜잭션(commit, rollback)을 지원하며, ACID를 보장한다.
# InnoDB 스토리지 엔진 구조
1) InnoDB Buffer pool
: 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두고, 쓰기작업을 일괄 처리할 수 있게 버퍼링해주는 역할을 한다.
- 버퍼풀은 아직 디스크에 기록되지 않은 변경된 데이터(커밋과 상관없는)를 가지고 있다. (dirty page)
- 이 더티페이지는 주기적으로 또는 체크포인트가 발생하면, write스레드가 필요한 만큼의 dirty page를 디스크로 기록한다.
2) Undo Log
: 데이터를 변경했을 때 변경되기 전의 데이터(이전 데이터)를 보관하는 장소로, 롤백 대비용이자, 트랜잭션의 격리수준을 유지하면서 높은 동시성을 제공하는 데 사용된다.
- READ COMMITTED 이상의 격리수준 (+REPEATABLE READ, SERIALIZABLE)에서 MVCC를 보장하기 위해, 언두 영역의 데이터를 이용해 커밋전의 데이터를 다른 사용자가 조회했을 때, 언두영역의 데이터를 반환한다.
- BEGIN으로 트랜잭션을 시작하고 장시간 동안 트랜잭션을 종료하지 않으면 언두영역이 무한정 커질 수 있다.
- undo log 는 system tablespace(ibdata1), undo tablespace(undo_001), temporary tablespace(ibtmp1) 안에 있는 '롤백 세그먼트' 내에 포함된 '언두(로그)세그먼트' 내에 존재한다.
3) INSERT Buffer
: 데이터가 변경(INSERT,UPDATE) 되는 경우, 데이터파일과 해당 테이블에 포함된 인덱스를 업데이트하는 작업도 필요한데,
이 때 변경해야할 인덱스 페이지가 버퍼풀에 있지 않아서 디스크로부터 읽어와서 업데이트를 해야 한다면, 이를 즉시 실행하지 않고 Insert Buffer에 저장해두고 바로 사용자에게 결과를 반환한다.
- 유니크 인덱스는 중복여부를 체크해야 하기 때문에 인서트버퍼를 사용할 수 없다.
- 인서트 버퍼에 임시로 저장돼 있는 인덱스 레코드 조각은 Insert buffer merge thread에 의해 병합된다.
4) Redo Log & Log Buffer
: Redo Log는 ACID를 보장하기 위해 변경된 내용을 순차적으로 디스크에 기록해둔 로그 파일이며 장애를 대비하기 위한 공간이고, Log buffer는 리두로그 버퍼링에 사용되는 공간이다.
5) Change Buffer
: 해당 페이지가 버퍼풀에 없을 때, 보조인덱스에 대한 변경사항을 캐시하는 공간으로, 메모리 영역에서는 버퍼풀의 일부이며, 디스크 영역에서는 DB서버 종료시 인덱스 변경이 버퍼링되는 공간이다.
6) Double write Buffer
: 버퍼풀에서 플러쉬된 페이지를 데이터파일에 쓰기 전에 이중으로 기록하여, os나 스토리지 충돌시 응급복구 할 때 사본을 찾을 수 있다.
'[MySQL 운영] > MySQL basic' 카테고리의 다른 글
InoDB 잠금 (2) record lock, gap lock, Next Key Lock, Insert Intention Lock, Auto Inc Lock (0) | 2021.01.29 |
---|---|
InoDB 잠금 (1) S락, X락, IS락, IX락 (1) | 2021.01.29 |
MySQL 잠금 (0) | 2021.01.29 |
Transaction isolation level (트랜잭션 격리수준) (0) | 2021.01.29 |
MySQL Replication 구조 (0) | 2021.01.29 |
MySQL Query cache (~5.7) (0) | 2021.01.29 |
MySQL 스레딩 구조 (0) | 2021.01.29 |
MySQL Architecture (0) | 2021.01.29 |
MySQL Memory (서버단위/세션단위) (0) | 2021.01.28 |