MySQL 은 MVCC(Multi Version Concurrency Control) 을 기반으로 동시성 제어를 합니다.
MVCC 에서는 롤백에 대비하여 각 행에 대해 여러 버전을 관리하는데 이를 undo log 로 저장합니다. 트랜잭션을 시작하고 커밋/롤백하기 전까지의 변경사항을 기록합니다.
history length 는 undo log 를 통해 관리되고 있는 변경사항들의 총합입니다.
아래의 방법을 통해 조회할 수 있습니다.
SHOW ENGINE INNODB STATUS;
Status 컬럼의 TRANSACTIONS 섹션 내에서 History list length 항목 확인
TRANSACTIONS 섹션은 아래처럼 생겼습니다.
------------
TRANSACTIONS
------------
Trx id counter 3075
Purge done for trx's n:o < 0 undo n:o < 0 state: running but idle
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 281750090282832, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
InnoDB 는 주기적으로/특정 트리거 동작 시 Purge Process 를 실행하여 이미 커밋/롤백된 히스토리를 제거합니다.
history length 가 너무 길면 Purge 할 때 CPU 가 튈 수 있습니다.
또한, 장기간 유지되면 disk에 flush를 해야 하기 때문에 write 부하가 증가하게 됩니다.