테이블구조
innodb의 모든 테이블은 PK를 기준으로 클러스터링되어 저장된다. 오라클의 IOT(index Organized Table)과 동일한 구조로 이다.
Buffer Pool
Innodb의 buffer Pool 크기를 설정하는 파라미터는 innodb_buffer_pool_size 이다.
Innodb의 buffer Pool 크기는 각 클라이언트 스레드가 사용할 메모리와 운영체제가 사용할 메모리를 제외하고 물리메모리의 50-80% 수준으로 권고된다.
Insert Buffer
Innodb는 Insert나 Update 작업으로 변경해야 할 인덱스 페이지가 버퍼 풀에 있으면 바로 변경하지만 디스크로부터 읽어와서 업데이트를 해야 한다면 임시공간에 저장해두고 바로 사용자에게 결과를 반환하는 형태로 성능을 향상시키는데 이때 사용하는 임시 메모리 공간을 Insert Buffer 라고 한다.
사용자에게 결과를 전달하기 전에 중복여부를 체크해야하는 Unique Index는 Insert Buffer를 사용할 수 없다.
인서트 버퍼에 임시로 저장되어 있는 인덱스 레코드조각은 이후 백그라운드 스레드에 의해 병합되는데 이 스레드를 인서트 버퍼 Merge thread 라고 한다. MySQL5.5부터는 Insert나 Delete로 인해 키를 추가하거나 삭제하는 작업에 대해서도 버퍼링이 된다.
Insert buffer는 Insert_change_buffering 설정 파라미터를 사용하여 사용을 제어한다
Redo로그 (로그 파일)
ACID를 보장하기 위해 변경된 내용을 순차적으로 디스크에 기록하는 로그 파일을 가지고 있다.
로그버퍼
사용량이 매우 많은 DBMS 서버의 경우에는 리두 로그의 기록 작업이 큰 문제가 되는데 이를 보완하기 위해 리두 로그를 버퍼링하게 되는데 이러한 공간을 로그 버퍼라고 한다.
로그 버퍼의 크기는 일반적으로 1-8MB 수준에서 설정하는 것이 적합한데, BLOB이나 TEXT와 같이 큰 데이터를 자주 변경하는 경우에는 더 크게 설정한다.
ACID
데이터베이스에서 트랜잭션의 무결성을 보장하기 위해 반드시 필요한 4가지 요소
A : Atomic, 트랙잭션은 원자성 작업이어야 한다.
C : Consistent, 일관성
I : Isolated, 격리성
D : Durable, 한번 저장된 데이터는 지속적으로 유지되어야 한다.
MVCC
레코드 레벨의 트랙잭션을 지원하는 DBMS가 제공하는 기능으로 잠금을 사용하지 않는 일관된 읽기를 제공한다.
InnoDB는 언두 로그를 이용해 이 기능을 구현한다.
멀티 버전이라 함은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미다.
READ UNCOMMITTED
다른 트랜잭션에서 COMMIT 되지 않은 데이터들을 읽어올 수 있는 레벨이다
- COMMIT 되지 않은 신뢰할 수 없는 데이터를 읽어옴(dirty read)
- 한 트랜잭션에서 동일한 SELECT 쿼리의 결과가 다름(non-repeatable read)
- 이전의 SELECT 쿼리의 결과에 없던 row가 생김(phantom read)
READ COMMITTED
다른 트랜잭션에서 COMMIT 된 데이터만 읽어올 수 있는 level
READ COMMITTED 에서 각각의 SELECT 쿼리는 그때그때 최신의 snapshot을 구축하여 데이터를 읽는다
- 한 트랜잭션에서 동일한 SELECT 쿼리의 결과가 다름(non-repeatable read)
- 이전의 SELECT 쿼리의 결과에 없던 row가 생김(phantom read)
REPEATABLE READ
MySQL InnoDB의 기본 isolation level.(동시성과 안정성의 균형)
This is the default isolation level for InnoDB. Consistent reads within the same transaction read the snapshot established by the first read.
REPEATABLE READ 는 한 트랜잭션에서 처음 데이터를 읽어올 때 구축한 snapshot에서 모두 데이터를 읽어온다. 매번 SELECT 쿼리의 결과들이 항상 처음과 동일하고, phantom read도 발생하지 않는다.
*참고도서 : RealMySQL
'MySQL > MySQL' 카테고리의 다른 글
MySQL의 격리 수준 (0) | 2024.12.06 |
---|---|
트랜잭션 격리 수준과 잠금 (0) | 2024.12.06 |
인덱스와 잠금 (0) | 2024.12.06 |
트랜잭션 & Autoincrement (0) | 2024.12.04 |
sample script(emp, dept, salgrade) (0) | 2024.12.04 |