MySQL vs Postgres MVCC, MySQL의 Repeatable Read

Rookedsysc·2024년 10월 30일

MySQL vs Postgres MVCC 동작

MySQL은 MVCC 동작을 할 때 versioning을 해서 Undo Log에 기록하는 식으로 삭제를 진행하지만 Postgres는 MVCC를 할 때 SoftDelete와 비슷하게 논리적으로 삭제하는 방식으로 Delete 연산을 처리한다.

이에 따라서 DB에서 삭제를 하고 조회를 할 때의 성능차이가 발생하는데 조회 성능은 실제로 데이터가 사라지는 MySQL 쪽이 좀 더 빠르다. 그러나 삭제 성능은 Undo 로그를 삭제할 필요없이 Update를 하는 Postgres 쪽이 좀 더 빠르다.

Postgres는 이러한 SoftDelete 목록이 더 이상 진짜로 필요없다라고 판단(MySQL에서 Undo 로그를 삭제하는 시점)될 때, Vacuum이라는 일종의 배치 동작을 통해서 실제로 데이터들을 삭제해주게 된다.

MySQL의 REPEATABLE READ와 Phantom Read

MySQL도 Postgres처럼 REPEATABLE READ에서 Phantom Read가 발생하지 않는데 이는 Next Level Lock + Gap Lock 때문이라고 한다.

  • Gap Lock
    • 인덱스 레코드 사이의 간격(gap)에 대해 잠금을 걸어 새로운 행의 삽입을 방지하는 잠금 방식
    • 예를 들어서 마지막 인덱스가 39라고 하면 39와 "무한대" 사이의 간격에 대해서도 잠금이 걸림 (이후 데이터 삽입이 방지됨)
  • Next Key Lock
    • 인덱스 레코드와 그 앞의 간격을 함께 잠그는 방식
    • 레코드락 + 갭락을 결합한 형태
  • 출처 : MySQL 공식문서

0개의 댓글