CS/DataBase

(MySQL) MySQL 스토리지 엔진 아키텍처 - InnoDB

주누 2022. 8. 31. 23:53

InnoDB 개요

InnoDB는 레코드 기반의 잠금을 제공하여 그로 인해 높은 동시성 처리가 가능하고 안정적이며 성능이 뛰어나다.


InnoDB 특징

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

InnoDB의 모든 테이블은 프라이머리 키 값의 순서대로 디스크에 저장된다.

첨언하자면 클러스터형 인덱스는 영어사전이다.
영어사전은 알파벳 순으로 정렬되어 있다는 특징이 있으며 보조 인덱스는 일반 책의 뒤편에 있는 찾아보기와 같다.
찾아보기를 통해 키워드에 해당하는 내용을 빠르게 찾을 수 있다는 특징이 있다.

외래 키 지원

외래 키는 InnoDB만 유일하게 지원한다.

 

외래 키 설정 시 주의사항

  • 외래 키 연관 테이블에 대한 잠금 전파 주의
  • 데드락 발생 주의
  • foreign_key_checks Option을 통해 외래 키 체크 해제 가능

MVCC (Mutli Version Concurrency Control)

InnoDB는 언두 로그 (Undo log)를 이용하여 트랜잭션의 격리 수준에 따른 레코드를 조회하는 것이 가능하다.

 

트랜잭션 격리수준

  • READ UNCOMMITTED (커밋되지 않은 읽기)
  • READ COMMITTED (커밋된 읽기)
  • REPEATABLE READ (반복 가능한 읽기)
  • SERIALIZABLE (직렬화 가능)

일반적으로는 디스크의 Name값은 버퍼 풀에 값과 동일하나 시점에 따라 다른 경우가 존재한다.

  • 최초 Insert 시점에는 버퍼 풀과 디스크에 데이터 적재
  • Update 시점에는 버퍼 풀에 데이터를 갱신하고 기존 데이터를 언두 로그에 적재한다.
  • 트랜잭션이 롤백되는 경우에는 언두 로그에 적재된 데이터를 다시 버퍼 풀로 복구하고 언두에 있는 데이터를 삭제 처리한다.

  • Update 쿼리에 대한 커밋 이전에 대상 테이블을 조회하면 격리 수준에 따라 다른 조회 결과를 발생시킨다.
Undo 영역은 트랜잭션이 없을 때 비로소 데이터를 삭제하기 때문에 긴 트랜잭션을 발생시키면 언두 영역에 부하를 줄 수 있기 때문에 가능한 빨리 커밋 혹은 롤백을 통해 트랜잭션을 완료하는 것이 바람직한 방법이다.

잠금 없는 일관된 읽기 (Non - Locking Consistent Read)

앞서 살펴보았던 MVCC가 가능하였던 이유는 테이블에 대한 잠금을 설정하지 않았기 때문이다.

조회 시 기본적으로 갱신된 데이터를 참조하지 않고 언두 로그에 대한 데이터를 참조하기 때문에 테이블에 대한 잠금이 필요 없다.


References

https://book.interpark.com/product/BookDisplay.do?_method=detail&sc.shopNo=0000400000&sc.prdNo=353614840&sc.saNo=003002001&bid1=search&bid2=product&bid3=title&bid4=00

 

싸니까 믿으니까 인터파크도서

생년월일 - 컴퓨터 공학을 전공하고 카카오에서 MySQL/MongoDB DBA로 근무하면서 DB 운영 및 트러블슈팅과 데이터 모델링, DBMS 도구 개발 및 신기술 벤치마킹을 수행했으며, 현재 당근마켓에서 MySQL/Mon

book.interpark.com

https://dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html

 

MySQL :: MySQL 8.0 Reference Manual :: 1.7.2.3 FOREIGN KEY Constraint Differences

1.7.2.3 FOREIGN KEY Constraint Differences The MySQL implementation of foreign key constraints differs from the SQL standard in the following key respects: If there are several rows in the parent table with the same referenced key value, InnoDB performs a

dev.mysql.com