본문 바로가기
DB/MySQL

[mysql/DB] 트랜잭션 언두로그?, 리두로그?, 버퍼?, 어댑티브 해시 인덱스?

by windy7271 2024. 6. 18.
728x90
반응형

언두 영역은 insert, update ,delete 같은 문장으로 데이터를 변경했을 때 변경되기 전의 데이터 를 보관하는 곳이다.

벽계수 → 수지 로 업데이트 쿼리를 날릴때때

 

사용자가 커밋하면 현재 상태가 그대로 유지되고, 롤백하면 언두 영역의 백업 된 데이터를 다시 데이터 파일로 저장한다.

언두 테이블스페이스(저장되는 공간)

 

언두 로그

  1. 트랜잭션 롤백 대비용
  2. 트랜잭션의 격리 수준을 유지하면서 높은 동시성 제공

 

트랜잭션이 완료되었다고 해당 트랜잭션이 생성한 언두 로그를 즉시 삭제 할 수 있는것은 아니다.

A→B→C 순으로 트랜잭션이 시작됐지만 B,C는 완료되었고 A는 아직 종료되지 않았을때 삭제되지 않는다.

InnoDB 스토리지 엔진은 언두 로그의 이력을 필요한 만큼 스캔해야만 필요한 레코드를 찾을 수 있기 때문에 트랜잭션이 종료되지않으면,쿼리의 성능이 전반적으로 떨어진다.

 

즉 MySQL 서버에서 활성 상태의 트랜잭션이 장시간 유지되는 것은 성능상 좋지않다.

 

8.0.14 이전 버전에서는 테이블 스페이스의 언두로그는 MySql 서버가 초기화 될 때 생성 되기 때문에 확장의 한계가 있다.

그 이후, 연두 로그는 항상 시스템 테이블스페이스 외부의 별도 로그 파일에 기록 되도록 개선됐다.

 

1개의 언두 테이블 스페이스 → 1개 이상 128개이하 롤백 세그먼트

롤백 세그먼트는 1개 이상의 언두 슬롯을 가진다.

하나의 트랜잭션이 필요로 하는 언두 슬롯의 갯수는 최대 4개까지 언두 슬롯을 사용하게 된다

 

일반적으로 트랜잭션이 임시 테이블을 사용하지 않아 하나의 트잭 안에 2개 정도의 언두 슬롯을 필요로 한다 라고 가정하면 아래와 같다

최대 동시 트랜잭션 수 = (InnoDB 페이지 크기) / 16 * (롤백 세그먼트 개수) * (언두 테이블스페이스 개수)

8.0 이후 변경, 추가, 삭제 가능하다.

Undo tablespace truncate : 언두 테이블 스페이스 공간을 필요한 만큼만 남기고 불필요하거나 관도하게 할당된 공간을 운영체제로 반납

방법:

  • 자동: InnoDB 스토리지 엔진의 퍼지 스레드 는 주기적으로 언두 로그 공간에서 불 필요한 언두로그를 삭제하는 작업을 실행한다 == 언두 퍼지
  • 수동 : 언두 테이블 스페이스가 최소 3개 이상은 되어야 작동한다.

버퍼 풀 :디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두는 공간

 

체인지 버퍼는 보조 인덱스 페이지가 버퍼 풀에 없을 때 변경 사항을 캐시하는 특수한 데이터 구조 (임시 메모리 공간)

버퍼 풀로 설정된 메모리 공간의 25~ 50% 까지 사용 가능

 

리두로그 : 비 정상적으로 서버가 종료 됐을때 데이터 파일에 기록되지 못한 데이터를 잃지 않게 해주는 안전장치

변경된 데이터를 데이터 파일에 기록하려면 상대적으로 큰 비용이 필요하다. 이로 인한 성능 저하를 막기 위해 DB서버는 쓰기비용이 낮은 자료 구조를 가진 리두로그 를 가지고 있으며,

비정상 종료가 발생하면 리두 로그의 내용을 이용해 서버 종료 직전의 상태로 복구한다.

DB서버는 리두로그를 버퍼링할 수 있는 InnoDB 버퍼 풀이나 리두로그를 버퍼링할 수 있는 로그 버퍼와 같은 자료 구조도 가지고 있다.

MySQL 서버에서 트랜잭션이 커밋돼도 데이터 파일이 즉시 디스크로 동기화 되지 않는 반면,

리드 로그 (트랜잭션 로드) 는 항상 디스크로 기록된다.

 

 

'누군가가 무엇을 했다는 정보'가 REDO 로그이다.

'어떻게 하면 과거의 상태로 돌아갈 수 있는지에 관한 정보'가 UNDO 정보이다

 


어댑티브 해시 인덱스 (Adaptive Hash Index)

 

InnoDB 스토리지 엔진에서 자주 요청하는 데이터에 대해 자동으로 생성하는 인덱스이다. 저장 공간인 메모리를 사용한다.

 

B-Tree 검색 시간을 줄여주기 위해 도입된 기능이다.

자주 읽히는 데이터 페이지의 키 값을 이용해 해시 인덱스를 만들고, 필요할 때 마다 어댑티브 해시 인덱스를 검색해서 저장된 페이지를 즉시 찾아간다.

 

장점: 루트노드 에서 리프 노드 까지 찾아가는 비용이 없어지고, CPU는 적은 일을 하지만 쿼리의 성능은 빨라지고, 많은 쿼리를 동시에 처리가 가능하다

 

인덱스 키 값 ,데이터 페이지 주소의 쌍으로 관리 된다.

인덱스 키 값 : B-Tree 인덱스 고유번호 + B-Tree 인덱스 실제 키 값 의 조합

 

mysql 8.0 부터 세마포어 경합을 줄이기 위해 어댑티브 해시 인덱스의 파티션 기능을 제공한다.(기본 8 개)

어떨때 사용하는것이 좋을까 ??

  1. ==, in 연산자가 많은경우
  2. 디스크 데이터 크기가 InnoDB 버퍼 풀 크기와 비슷한 경우
  3. 쿼리가 일부 데이터에만 집중되는 경우

삭제, 변경 작업은 스키마가 변경되는 동안 상당히 많은 CPU자원을 사용해 DB 서버 처리 성능이 느려진다.

반응형

댓글