InnoDb

스토리지 엔진 중에서 거의 유ㅜ일하게 레코드 기반의 잠금을 제공하고, 때문에 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다.

------------
메모리 영역
( InnoDB 버퍼 풀, 로그버퍼)
------------
CPU 연산영역
(인서트 버퍼 머지 스레드, Write 스레드, 기타스레드, 로그 스레드 )
------------
디스트 스토리지 영역
(시스템 테이블스페이스, 사용자 테이블 스페이스 , 리두 로그)
------------

InnoDB 구조

3.2.1 InnoDB 스토리지 엔진의 특성

  1. 프라이 머리 키에 의한 클러스터링 : 프라이머리 키값의 순서대로 디스크에 저장된다는 뜻이다.
  2. 잠금이 필요없는 일관된 읽기(Non-locking consistent read)
  3. 외래키 지원 : 왜래키는 부모테이블과 자식테이블 모두 인덱스 생성이 필요하고, 변경시 확인 작업이 필요하므로, 잠금이 여러 테이블로 전파되고, 그로 인해 데드락이 발생할 때가 많다.
  4. 자동 데드락 감지 : 감지된 데드락은 관련 트랜잭션 중에서 ROLLBACK 이 가장 용이한 트랜잭션을 자동적으로 강제 종료해 버린다.
  5. 자동화된 장애 복구 : 손실이나 장애로 부터 데이터를 보호하기 위한 여러 가지 메커니즘이 탑재되 있다.
  6. 오라클 아키텍쳐 적용 : 오라클 DBMS 의 기능과 상당히 비슷한 부분이 많다.

3.2.2 InnoDB 버퍼 풀

가장 핵심적인 부분으로, 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간이다. 쓰기 작업을 지연시켜 일괄 작업으로 처리할 수 있게 해주는 버퍼역할도 한다.

MyISAM 키 캐시가 인덱스의 캐시만을 주로 처리하는데 비해 InnoDB 버퍼 풀은 데이터와 인덱스 모두 캐시하고 쓰기 버퍼링 역할까지 모두 처리하고 있다.

3.2.3 언두(Undo)로그

언두 영역은 Update 문장이나 Delete 와 같은 문장으로 데이터를 변경했을 때 변경되기 전의 데이터를 보관하는 곳이다. 언두의 데이터는 크게 두가지 용도로 사용되는데, 첫번째 용도가 트랜잭션의 롤백 대비용이고, 두번째 용도는 트랜잭션의 격리 수준을 유지하면서 높은 동시성을 제공하는데 사용된다.

3.2.4 인서트 버퍼(Insert Buffer)

Insert/Delete 될때, 파일 변경 작업 뿐 아니라 인텍스를 업데이트 하는 작업도 필요하다. 변경해야 할 인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트를 수행하지만, 그렇지 않고 디스크로부터 읽어와서 업데이트 해야 한다면 이를 즉시 실행하지 않고 임시공간에 저장해 두고 바로 사용자에게 결과를 반환하는 형태로 성능을 향상시키게 되는데, 이 임시 메모리 공간을 인서트버퍼(Insert buffer) 라고 한다.

3.2.5 리두(Redo) 로그 및 로그 버퍼

변경된 내용을 순차적으로 디스크에 기록하는 로그파일을 가지고 있는데, 이를 리두로그라 한다.

3.2.6 MVCC(Munti Version Concurrency Control)

일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS 가 제공하는 기능이며, MVCC 의 가장 큰 목적은 잠금을 사용하지 않는 일관된 일기를 제공하는데 있다.

3.2.7 잠금없는 일관된 읽기(Non-locking consistent read)

특정 사용자가 레코드를 변경하고 아직 커밋을 수행하지 않았다 하더라도 이변경 트랜잭션이 다른 사용자의 Select 작업을 방해하지 않는다. 이를 "잠금 없는 일관된 읽기 " 라고 표현하며 변경되기 전의 데이터를 읽기 위해 언두 로그를 사용한다.

3.2.8 InnoDB와 MyISam 스토리지 엔진 비교

3.2.9 InnoDB와 MEMORY(HEAP) 스토리지 엔진 비교

MEMORY 스토리지 엔진의 가장큰 장점은 데이터와 인덱스를 모두 메모리에 저장하기때문에 저장 작업이나 읽기 작업이 매우 빠르다는 것이다.