14.13.4 InnoDB 변경 버퍼링 구성
테이블에 대해 INSERT
, UPDATE
및 DELETE
작업이 수행되면 인덱스 컬럼의 값 (특히 부 키 값)은 종종 정렬 된 순서대로되지 않기 때문에 보조 인덱스를 최신 상태로 위해 대량의 I / O가 필요합니다. InnoDB
는 삽입 버퍼 를 제공합니다. 이것은 관련된 페이지 가 버퍼 풀 에없는 경우에 보조 인덱스 항목에 대한 변경을 캐시하여 해당 페이지를 디스크에서 읽어 않음으로써 I / O 조작을 방지하는 것입니다. 버퍼링 된 변경은 해당 페이지가 버퍼 풀에로드 된 경우 병합 된 업데이트 된 페이지는 나중에 일반 메커니즘을 사용하여 디스크에 플래시됩니다. InnoDB
의 메인 스레드는 그 버퍼링 된 변경을 서버가 거의 유휴 상태에있을 때와 저속 종료 중에 병합합니다.
이렇게하면 디스크 읽기 및 쓰기가 줄어들 수 있기 때문에이 기능은 I / O에 의존하는 작업 (예를 들어, 대량 삽입 등의 대량의 DML 작업을 포함하는 응용 프로그램)에서 매우 가치가 있습니다.
그러나 삽입 버퍼는 버퍼 풀의 일부를 차지하기 위해 데이터 페이지를 캐시하는 데 사용할 수있는 메모리가 줄어 듭니다. 작업 집합이 버퍼 풀에 거의 들어가거나 테이블의 보조 인덱스가 적은 경우는 삽입 버퍼링을 비활성화하면 도움이 될 수 있습니다. 작업 집합이 버퍼 풀에 끼울 경우는 삽입 버퍼링은 버퍼 풀에없는 페이지에만 적용되지 않으므로 추가로 부과하는 오버 헤드는 없습니다.
InnoDB
가 어느 정도 삽입 버퍼링을 수행하거나 시스템 구성 매개 변수 innodb_change_buffering
를 사용하여 제어 할 수 있습니다. 삽입 작업 삭제 작업 (인덱스 레코드가 처음에 삭제 표시 될 때) 및 제거 작업 (인덱스 레코드가 물리적으로 제거 될 때)에서 버퍼링을 활성화하거나 비활성화 할 수 있습니다. 업데이트 작업은 삽입과 삭제의 조합으로 표시됩니다. MySQL 5.5 이상에서는 기본값이 inserts
에서 all
로 변경되었습니다.
innodb_change_buffering
의 허용되는 값은 다음과 같습니다.
all
기본값 : 버퍼의 삽입, 삭제 마킹 작업 및 퍼지.
none
어떤 조작도 버퍼링하지 않습니다.
inserts
삽입 작업을 버퍼링합니다.
deletes
삭제 마킹 작업을 버퍼링합니다.
changes
삽입과 삭제 표식을 모두 버퍼링합니다.
purges
백그라운드에서 실행되는 영구 삭제 작업을 버퍼링합니다.
이 매개 변수의 값은 MySQL 옵션 파일 ( my.cnf
또는 my.ini
)로 설정하거나 SET GLOBAL
명령 (여기에는 SUPER
권한이 있어야합니다)에서 동적으로 변경할 수 있습니다. 이 설정을 변경하면 새로운 작업 버퍼링에 영향을 미칩니다. 이미 버퍼링 된 항목의 병합은 영향을받지 않습니다.
INSERT
, UPDATE
및 DELETE
문 고속화 대한 자세한 내용은 섹션 8.2.2 "DML 문 최적화" 를 참조하십시오.