[Real MySQL] 4.2. InnoDB 스토리지 엔진

@lim · August 17, 2024

InnoDB 스토리지 엔진 아키텍처

InnoDB 구조 (출처)

InnoDB Architecture
InnoDB Architecture

8.0 버전부터 기존 스토리지 엔진으로 사용

레코드 기반 잠금 제공 → 높은 동시성 처리 가능

프라이머리 키에 의한 클러스터링

기본적으로 InnoDB의 모든 테이블은 프라이머리 키를 기준으로 클러스터링 되어 저장한다.

PK Value의 순서대로 디스크에 저장된다.

  • PK가 클러스터링 인덱스 이기에 PK를 이용한 레인지 스캔은 빨리 처리될 수 있다.
  • 쿼리 실행 계획에서 PK는 기본적으로 다른 보조 Index에 비해 비중이 높게 설정된다. (쿼리 실행 계획서에서 다른 보조 Index보다 PK가 선택될 확률이 높음)

반대로 MyISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않는다.

  • MyISAM 테이블에서는 PK와 세컨더리 인덱스는 구조적으로 차이가 없다. (PK는 단지 유니크 제약을 가진 세컨더리 인덱스)
  • MyISAM 테이블의 모든 인덱스는 물리적인 레코드 주소 값(ROWID)를 가진다.

외래 키 지원

외래 키 지원은 InnoDB 엔진 레벨에서 지원하는 기능이기에 MyISAM, MEMORY 테이블에서는 사용 할 수 없다.

InnoDB 에서 외래 키는 부모 테이블과 자식 테이블 모두 잠금이 전파된다.

이로 인해 데드락이 발생할 수도 있으므로 외래 키 존재에 주의해야 한다.

외래 키에 의해 데이터 변경 작업이 불가능하다면 foreign_key_checks 시스템 변수를 OFF로 설정하면 된다.

SET foreign_key_checks=OFF;
SET foreign_key_checks=ON;

-- 현재 세션에서만 설정할 경우
SET SESSION foreign_key_checks=OFF;
  • 작업한 외래키에 연관된 테이블의 데이터도 같이 일관성을 맞추고 foreign_key_checks 를 활성화 해야 한다.

MVCC(Multi Version Concurrency Control)

레코드 레벨의 트랜잭션을 DBMS에서 지원하는 기능이다.

MVCC의 목적은 잠금을 사용하지 않은 일관된 읽기를 제공하는 데 있다.

InnoDB는 Undo log 를 이용해 구현한다.

  • 멀티 버전 : 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미

잠금 없는 일관된 읽기

  • MVCC 기술을 이용해 락을 걸지 않고 읽기 작업을 수행한다.
    • 격리 수준이 READ_UNCOMMITTED READ_COMMITTED REPEATABLE_READ 라면 순수한 읽기 SELECT 작업은 다른 트랜잭션 변경과 관계 없이 바로 실행된다.
    (잠금을 대기하지 않는다.)
  • 특정 사용자가 레코드를 변경하고 아직 COMMIT을 하지 않았을 경우에는 변경 트랜잭션이 다른 사용자의 SELECT 작업에 영향이 가지 않는다.
    • '잠금 없는 일관된 읽기' 라고 하며, 변경 전 데이터를 읽기 위해 UNDO log를 활용한다.

자동 데드락 감지

내용이 길어져 따로 분리하여 정리하였다. 링크

참고 내용

@lim
기억은 기록기록