체인지 버퍼
Insert/Update 시, 인덱스를 업데이트 하는 작업도 필요한데, 이는 랜덤 I/O 작업이 필요하기 때문에 많은 리소스를 차지하게 된다. InnoDB는 버퍼 풀에 있다면 바로 업데이트를 실행하지만 없을 경우, 체인지 버퍼라는 임시 공간에 저장해 두고 바로 사용자에게 바로 결과를 반환한다.
- 사용자에게 결과를 반환하기 전에 중복 여부를 체크해야하는 유니크 인덱스는 체인지 버퍼를 사용할 수 없다.
- 버퍼 머지 스레드: 체인지 버퍼에 임시로 저장된 인덱스 레코드 조각을 병합하는 백그라운드 스레드
- MySQL 5.5에서는 Insert에서만 버퍼링이 가능했으나, 8.0 이후부터는 Insert, Delete, Update로 키를 추가하거나 삭제하는 작업에 대해서도 버퍼링 할 수 있다.
- 기본적으로 체인지 버퍼는 InnoDB 버퍼 풀로 설정된 메모리 공간의 25%까지 사용할 수 있으며 필요하면 50%까지 사용하게 설정 가능하다.
- innodb_change_buffer_max_size로 조절 가능하다
- innodb_change_buffering
- MySQL5.5에서는 해당 기능은 반드시 활성화 되었지만 이 후 버전부터는 해당 변수로 작업 종류별로 활성화 할 수 있다.
- all : 모든 인덱스 관련 작업을 버퍼링(insert, update, delete)
- inserts: 인덱스에 새로운 아이템을 추가하는 작업만 버퍼링
- deletes: 인덱스에서 기존 아이템을 삭제하는 작업만 버퍼링(삭제됐다는 마킹 작업만)
- changes: 인덱스를 추가/삭제 하는 작업만 버퍼링
- purges: 인덱스 아이템을 영구적으로 삭제하는 작업만 버퍼링
- none: 버퍼링 안함
Change Buffer 메모리 공간 크기와 오퍼레이션 처리 횟수
select event_name, current_number_of_bytes_used
from performance_schema.memory_summary_global_by_event_name
where event_name = 'memory/innodb/ibuf0ibuf';

show engine innodb status;
- iBuf에 오퍼레이션 처리 횟수가 나온다.