MySQL InnoDB 스토리지 엔진 정리 (1)

InnoDB

특징

  • 레코드 기반 잠금 제공
  • 그러므로 높은 동시성 처리 가능
  • 안정적 & 뛰어난 성능

PK & 클러스터링

  • PK 기준으로 클러스터링(= PK 값 순서대로 디스크에 저장)
  • PK가 클러스터링 인덱스이므로 PK를 이용한 레인지 스캔 매우 빨리 처리됨
  • 세컨더리 인덱스는 프라이머리 키의 값을 논리적인 주소로 사용
  • 쿼리 실행 계획에서 PK는 다른 보조 인덱스보다 비중이 높게 설정됨
  • MyISAM과 다르게 클러스터링 키 지원 X

외래키

  • 부모 테이블과 자식 테이블 모두 해당 컬럼에 인덱스 생성 필요
  • 변경 시에는 반드시 부모 테이블이나 자식 테이블에 데이터가 있는지 확인하는 작업 필요
  • 이로 인해 잠금이 여러 테이블 전파 → 데드락 발생 많음
  • InnoDB에서 외래키 사용할 때 주의
  • 외래 키 체크 작업 일시 정지 가능
      mysql> SET foreign_key_checks=OFF;
        
      -- 필요한 DB 작업 진행
        
      mysql> SET foreign_key_checks=ON;
    

MVCC(Multi Version Concurrency Control)

  • 잠금을 사용하지 않는 일관된 읽기를 제공하기 위한 목적
  • InnoDB에서는 undo log를 이용해 구현
  • REPEATABLE READ 격리 수준 참고

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

  • MVVC 기술을 이용해 잠금을 걸지 않고 읽기 작업을 수행
  • 격리 수준이 SERIALIZABLE이 아닌 READ_UNCOMMITED, READ_COMITTED, REPEATABLE_READ 수준일 경우에는 INSERT와 연결되지 않은 순수한 읽기 작업은 다른 트랜잭션 변경 작업과 관계없이 항상 잠금 없이 바로 실행

자동 데드락 감지

  • 내부적으로 교착 상태에 빠지지 않았는지 확인하기 위해 잠금 대기 목록을 그래프 형태로 관리
  • 데드락 감지 스레드를 가지고 있어서, 데드락 감지 스레드가 주기적으로 잠금 대기 그래프를 검사해 교착 상태에 빠진 트랜 잭션을 찾아 그 중 하나를 강제 종료함
  • 언두 로그 레코드가 더 적은 트랜잭션이 롤백 대상
  • 자동화된 장애 복구
    • MySQL 서버가 실행될 때 완료되지 못한 트랜잭션이나 디스크에 일부만 기록된 데이터 페이지에 대한 복구 작업 자동 진행