You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
UPDATE 문이 실행되면 커밋 여부와 관계없이 InnoDB 버퍼 풀에는 새로운 값이 들어온다.
변경 전 값만 언두 로그에 복사된다.
commit 이나 rollback이 안 된 상태에서 조회하면 어떤 값을 읽을까?
READ_UNCOMMITED
InnoDB 버퍼 풀이 갖고 있는 변경된 데이터를 읽어서 반환한다.
READ_COMMITTED 이상인 경우
아직 커밋되지 않았기 때문에 언두 영역의 데이터를 반환한다.
InnoDB 버퍼 풀과 리두로그
clean page : InnoDB의 버퍼 풀은 디스크에서 읽은 상태로 전혀 변경되지 않은 페이지이다.
dirty page : insert, update, delete 명령으로 변경된 데이터를 가진 페이지이다.
LSN : log sequence number
checkpoint age : 활성 리두 로그 공간의 크기
InnoDB의 버퍼 풀은 서버의 메모리가 허용하는 만큼 크게 설정하면 할수록 쿼리의 성능이 빨라진다.
그러나 메모리 공간만 단순히 늘리는 것은 데이터 캐시 기능만 향상시키는 것이다. 버퍼 풀의 쓰기 버퍼링 기능까지 향상 시키라면?
dirty page는 언젠가 디스크에 기록되어야 한다. 버퍼 풀에 무한정 머무를 수 없다.
InnoDB 스토리지 엔진에서 리두 로그는 1개 이상의 고정 크기 파일을 연결해서 순환 고리처럼 사용한다.
즉 데이터 변경이 일어나면 리두 로그 파일에 기록된 로그 엔트리는 다시 새 엔트리로 덮어 쓰인다.
전체 리두 로그 파일에서 재사용 가능한 공간, 당장 불가능한 공간이 나뉘는데 불가능한 공간이 활성 리두 로그이다(화살표 가진 엔트리)
리두 로그 파일의 공간이 재사용될 수록 로그 포지션은 계속 증가된 값(LSN)을 가진다.
InnoDB 스토리지 엔진은 주기적으로 체크포인트 이벤트를 발생시켜 리두 로그와 버퍼 풀의 dirty page를 디스크로 동기화 시킨다.
발생한 체크포인트 중 가장 최근 지점의 LSN이 활성 리두 로그 공간의 시작점이 된다.
그러나 활성 리두 로그 공간의 마지막은 계속해서 증가하기 때문에 체크포인트와 무관하다.
그리고 가장 최근 체크포인트의 LSN과 마지막 리두 로그 엔트리 LSN의 차이를 checkpoint age라고 한다.
따라서
InnoDB 버퍼 풀의 더티 페이지는 특정 리두 로그 엔트리와 관계를 가진다.
체크포인트가 발생하면 체크포인트 LSN 보다 작은 리두 로그 엔트리와 관련된 더티 페이지, 리두 로그 엔트리는 모두 디스크로 동기화 된다.
Q. InnoDB 버퍼 풀이 100GB, 리두 로그 파일의 전체 크기가 100MB인 경우
리두 로그 파일 크기가 100MB가 최대이므로, checkpoint age 또한 최대 100MB이다.
평균 리두 로그 엔트리가 4KB면 100MB/4KB 인 25600개 dirty page만 버퍼 풀에 보관할 수 있다.
각 dirty page가 16KB라고 하면 허용 가능한 전체 dirty page는 400MB 밖에 안 된다.
따라서 버퍼 풀의 크기만 크고 실제 버퍼링 효과는 못보게 된다.
Q. InnoDB 버퍼 풀이 100MB, 리두 로그 파일의 전체 크기가 100GB인 경우
400GB 정도의 dirty page를 가질 수 있다.
하지만 버퍼 풀 크기가 100MB이므로, dirty page 크기 또한 100MB가 최대이다.
버퍼풀 크기 100GB면 리두 로그 파일은 5~10GB 수준이 적정
어댑티브 해시 인덱스
인덱스: 테이블에서 사용자가 설정한 B-Tree 인덱스
사용자가 수동으로 설정하는 것이 아닌, InnoDB 스토리지 엔진에서 사용자가 자주 요청하는 데이터에 대해 자동으로 생성하는 인덱스
InnoDB가 주로 많이 사용되는 스토리지 엔진이지만 다른 스토리지 엔진도 같이 확인해보면 좋을 것 같아서 같이 보면 좋을 포스트 공유드려요.
책에도 MyISAM까지는 간단히 설명되어 있는데, Memory 엔진(혹은 TempTable)도 인지하고 있으면 좋을 것 같아요.
04. 아키텍처
MVCC( Multi Version Concurrency Control )
commit 이나 rollback이 안 된 상태에서 조회하면 어떤 값을 읽을까?
READ_UNCOMMITED
READ_COMMITTED 이상인 경우
InnoDB 버퍼 풀과 리두로그
InnoDB의 버퍼 풀은 서버의 메모리가 허용하는 만큼 크게 설정하면 할수록 쿼리의 성능이 빨라진다.
그러나 메모리 공간만 단순히 늘리는 것은 데이터 캐시 기능만 향상시키는 것이다. 버퍼 풀의 쓰기 버퍼링 기능까지 향상 시키라면?
dirty page는 언젠가 디스크에 기록되어야 한다. 버퍼 풀에 무한정 머무를 수 없다.
InnoDB 스토리지 엔진에서 리두 로그는 1개 이상의 고정 크기 파일을 연결해서 순환 고리처럼 사용한다.
즉 데이터 변경이 일어나면 리두 로그 파일에 기록된 로그 엔트리는 다시 새 엔트리로 덮어 쓰인다.
전체 리두 로그 파일에서 재사용 가능한 공간, 당장 불가능한 공간이 나뉘는데 불가능한 공간이 활성 리두 로그이다(화살표 가진 엔트리)
리두 로그 파일의 공간이 재사용될 수록 로그 포지션은 계속 증가된 값(LSN)을 가진다.
InnoDB 스토리지 엔진은 주기적으로 체크포인트 이벤트를 발생시켜 리두 로그와 버퍼 풀의 dirty page를 디스크로 동기화 시킨다.
발생한 체크포인트 중 가장 최근 지점의 LSN이 활성 리두 로그 공간의 시작점이 된다.
그러나 활성 리두 로그 공간의 마지막은 계속해서 증가하기 때문에 체크포인트와 무관하다.
그리고 가장 최근 체크포인트의 LSN과 마지막 리두 로그 엔트리 LSN의 차이를 checkpoint age라고 한다.
따라서
Q. InnoDB 버퍼 풀이 100GB, 리두 로그 파일의 전체 크기가 100MB인 경우
Q. InnoDB 버퍼 풀이 100MB, 리두 로그 파일의 전체 크기가 100GB인 경우
어댑티브 해시 인덱스
B- tree , Adaptive Hash Index
B-tree
Adaptive Hash Index
cpu 사용량
처리량
주의사항
The text was updated successfully, but these errors were encountered: