[MySQL] 체인지 버퍼

신찬규·2024년 6월 30일

MySQL

목록 보기
9/13

RDBMS에서INSERTUPDATE, DELETE와 같은 작업은 데이터 파일을 변경하는 작업 뿐만 아니라 해당 테이블의 인덱스를 갱신하는 작업도 필요하다. 만약 InnoDB 버퍼 풀에 해당 인덱스 페이지가 존재한다면 바로 갱신이 가능하지만, 그렇지 않다면 디스크 I/O가 필요하다. 체인지 버퍼는 이를 버퍼링하기 위한 버퍼다. 체인지 버퍼에 기록된 사항은 나중에 해당 인덱스 파일이 읽기 연산에 의해 버퍼 풀로 로드되면 병합된다.

단, 체인지 버퍼는 유니크하지 않은 인덱스에만 사용할 수 있다. Primary key이거나 유니크 인덱스인 경우, 반드시 중복 여부를 체크해야 하기 때문이다. 체인지 버퍼를 사용하면 중복된 키 값이 삽입되는 것을 막을 수 없기 때문에 데이터 무결성과 일관성이 깨질 수 있다. 즉, 체인지 버퍼는 나중에 병합할 수 있는 인덱스의 변경 사항에 대해서만 버퍼링한다.

만약 인덱스의 변경 사항이 상당히 많다면, 체인지 버퍼 병합 작업은 상당한 디스크 I/O가 필요하게 된다. 이 때문에 디스크에 대한 쿼리 연산의 성능이 저하될 수 있다. 그래서 체인지 버퍼가 비효율적인 경우 innodb_change_buffering 시스템 변수의 설정을 통해 어느 정도까지 버퍼링할 지 설정할 수 있다.

  • none: 기본 설정으로, 버퍼링하지 않는다.
  • inserts: 삽입 연산만 버퍼링한다.
  • deletes: 삭제 마킹 연산만 버퍼링한다. 즉, 나중에 purge 연산 동안 삭제될 인덱스 레코드에 마킹하는 연산만 버퍼링한다.
  • changes: 삽입과 삭제 마킹 연산만 버퍼링한다.
  • purges: 백그라운드에서 수행되는 물리적인 삭제 연산만 버퍼링한다.
  • all: 삽입, 삭제 마킹, 삭제 연산 모두 버퍼링한다.

체인지 버퍼는 디스크 작업을 버퍼링할 수 있기 때문에 I/O 연산이 많은 배치 애플리케이션 등에 적합하다.

그러나, 체인지 버퍼는 InnoDB 버퍼 풀 공간 내에 존재하기 때문에 체인지 버퍼가 차지하는 메모리 공간 만큼 버퍼 풀에 데이터 페이지를 캐싱할 수 없게 된다. 그래서 보조 인덱스가 거의 없거나 한 경우 체인지 버퍼를 사용하지 않는 것이 좋다. 체인지 버퍼의 크기는 innodb_change_buffer_max_size로 설정할 수 있다.

참고 자료

profile
느려도 조금씩 꾸준하게

0개의 댓글