ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 체인지 버퍼
    DataBase/MySQL 2022. 8. 2. 20:18

    RDBMS 에서 레코드가 INSERT 되거나 UPDATE될 때는 데이터 파일을 변경하는 작업 뿐 아니라 해당 테이블에 포함된 인덱스를 업데이트하는 작업도 필요합니다.

    이때 인덱스를 업데이트 하는 작업은 랜덤하게 디스크를 읽는 작업을 선행해야 하므로 테이블에 인덱스가 많으면 이 작업은 많은 자원을 소모하게 됩니다.

    InnoDB 는 변경해야 할 인덱스 페이지가 버퍼 풀에 있으면 바로 업데이트를 하지만 그렇지 않고 디스크로 부터 읽어와서 업데이트를 해야 한다면 즉시 실행하지 않고 임시 공간에 저장해 두고 바로 사용자에게 결과를 반환하는 형태로 성능을 향상 시킵니다.

    이때 사용하는 임시 메모리 공간을 체인지 버퍼 라고 합니다.

    하지만 유니크 인덱스의 경우 중복 여부를 체크해야 하기 때문에 체인지 버퍼를 사용할 수 없습니다.

    체인지 버퍼에 임시로 저장된 인덱스 레코드 조각은 이후 백그라운드 스레드에 의해 병합됩니다. 이 스레드는 체인지 버퍼 머지 스레드라고 합니다.

    MySQL 5.5 부터 조금씩 개선되면서 MySQL 8.0 에서는 INSERT, DELETE, UPDATE로 인해 키를 추가하거나 삭제하는 작업에 대해서도 버퍼링이 될 수 있게 개선되었습니다.

    또한 MySQL 5.5 부터는 innodb_change_buffering 이라는 시스템 변수가 새로 도입되어 작업의 종류별로 체인지 버퍼를 활성화 할 수 있습니다.

    만약 체인지 버퍼가 비효율적일 때는 체인지 버퍼를 사용하지 않게 설정할 수있도록 개선되었습니다.

    innodb_change_buffering 시스템 변수에 설정할 수 있는 값은 다음과 같습니다.

    • all : 모든 인덱스 관련 작업을 버퍼링
    • none : 버퍼링 안함
    • insert: 인덱스에 새로운 아이템을 추가하는 작업만 버퍼링
    • deletes : 인덱스에서 기존 아이템을 삭제하는 작업(삭제됐다는 마킹 작업)만 버퍼링
    • changes : 인덱스에 추가하고 삭제하는 작업만(inserts + deletes)버퍼링
    • purges : 인덱스 아이템을 영구적으로 삭제하는 작업만 버퍼링(백그라운드 작업)

    체인지 버퍼는 기본적으로 InnoDB 버퍼 풀로 설정된 메모리 공간의 25% 까지 사용할 수 있게 설정 돼 있습니다.(필요하면 50% 까지 늘릴 수 있습니다.)

    체인지 버퍼가 너무 많은 버퍼 풀 공간을 사용하지 못하도록 하거나 INSERTUPDATE 등이 너무 빈번하게 실행되어 체인지 버퍼가 더 많은 버퍼 풀을 사용할 수 있게 하고자 하면 innodb_change_buffer_max_size 시스템 변수에 비율을 설정하면 됩니다.

    'DataBase > MySQL' 카테고리의 다른 글

    MySQL Begin 과 Start Transaction  (0) 2022.12.16
    B-Tree 와 B+Tree 의 차이점  (0) 2022.08.02
    MySQL 변수 종류  (0) 2022.04.27
    MySQL 사용자 변수  (0) 2022.04.25

    댓글