less than 1 minute read

MVCC는 트랜잭션의 격리(Isolation)을 스냅샷 수준에서 구현한 메커니즘이다. MVCC가 적용된 데이터베이스에서 인덱스는 어떻게 동작할까?

가장 간단한 방법은 인덱스가 객체의 모든 버전들을 가리키도록 하는 것이다,. 또한, 현재 트랜잭션이 볼 수 없는 객체의 버전을 인덱스가 무시하면 된다. 가비지컬렉션이 더이상 사용되지 않는 객체의 버전을 제거할 때, 이 버전의 인덱스 역시 제거된다.

실제로 활용되는 MVCC는 성능을 고려해야 한다. 예를 들어, PostgreSQL은 동일한 페이지에 동일한 객체가 다른 버전을 갖고 있다면 인덱스 갱신을 하지 않는다.

B-trees를 사용한 MVCC

CouchDB는 B-trees를 사용한다. 트리의 페이지가 갱신될 때 이 페이지의 새로운 버전으로 덮어쓰지 않고, 수정된 페이지 각각의 복제본을 생성한다. 이후, 이 수정된 페이지의 부모 페이지가 새 버전의 복제 페이지를 가리킨다.

쓰기만 가능한 B-trees의 경우, 모든 쓰기 트랜잭션이 새로운 트리의 루트를 만든다. 이렇게 되면, 각각의 루트들은 자신이 생성될 때 데이터베이스의 일관된 스냅샷이 되는 것이다. 트리의 루트만 새롭게 생성할 수 있기 때문에, 트랜잭션ID 를 사용하여 객체를 골라낼 필요가 없다.

B-trees 기반의 MVCC의 단점은 무엇일까? 백그라운드 프로세스를 구동해야하는 리소스가 필요하고, 압축과 가비지 컬렉션을 수행해야 한다.