(DB) DB Transaction & Index

HEYDAY7·2022년 12월 7일
0

서버 관련 Background

목록 보기
7/10

DB Transaction

데이터베이스에서 하나의 논리적 기능을 수행하기 위한 작업의 단위를 말하며, 여러 개의 쿼리들을 하나로 묶는 단위이다.

Transaction의 성질

Atomicity

트랜잭션과 관련하여 쿼리들이 모두 수행되거나 하나도 수행되지 않는 "All or Nothing"을 의미한다. commit과 rollback을 통해서 데이터의 무결성이 유지된다.

  • commit : 여러 쿼리가 성공적이였다고 확정되는 명령어를 말하며, 트랜잭션 단위로 수행된다. 이 commit 되었다의 뜻은 영구적으로 저장되었다 라는 말과 같다.
  • rollback : 에러 혹은 여러 이슈로 인해 트랜잭션으로 처리한 하나의 쿼리 묶음을 일어나기 전으로 되돌리는 것을 말한다.

또 하나의 트랜잭션 안에 외부 API가 있을 경우 rollback에 어떻게 대처할지에 대한 방법이 정해져 있어야 한다.

Consistency

허용된 방식으로만 데이터를 변경해야 한다는 것을 의미한다. 즉 항상 일관된 방식으로 트랜잭션 작업을 처리해야 한다.

Isolation

격리성이며, 여러 트랜잭션이 동시에 진행될 때 서로 끼어들 수 없다는 것을 의미한다. 이 격리성에는 여러 수준이 존재한다.

SERIALIZABLE

트랜잭션을 순차적으로 진행시키는 것을 말한다. 여러 트랜잭션이 동일한 행에 동시접근 할 수 없고, 그렇기 때문에 교차 상태가 일어날 확률이 많고, 성능이 떨어진다.

REPEATABLE_READ

하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정하지 못한다. 다만 새로운 행이 추가될 수는 있다.

  • 팬텀 리드 : phantom read, 해당 격리조건에서 일어날 수 있는 현상으로, 하나의 트랜잭션 내부에서 동일한 쿼리를 보냈을 때 그 조회 결과가 다른 경우를 말한다.

READ_COMMITTED

다른 트랜잭션이 commit한 정보에 대해서만 조회가 가능하다. 또 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 또 수정할 수 있다. 가장 많이 사용되는 격리수준으로 MySQL8.0, PostgreSQL 등의 기본값입니다.

  • non-repeatable read : 한 트랜잭션 내에서 같은 행을 두 번 이상 조회하였는데, 그 데이터(값)이 다른 경우를 말한다.

READ_UNCOMMITTED

다른 트랜잭션이 commit하지 않은 행에 대해서도 다른 트랜잭션에 노출이 됩니다. 가장 격리 수준이 낮고, 데이터 무결성을 해칠 수 있으나, 조금의 손실을 무시하고 빠른 속도를 내기 위해서는 유용합니다.

  • 더티리드 : dirty read, 한 트랜잭션이 실행 중일 때 다른 트랜잭션에 의해 수정되었지만 commit되지 않은 결과물을 읽을 수 있는 현상을 말한다.

Durability

트랜잭션이 성공적으로 완료되었을 경우, 그 결과는 영원히 반영되어야 하는 것을 의미한다. 이를 위해 체크섬, 저널링, 롤백 등의 기능을 제공한다.

DB Index

DB에서 데이터를 빠르게 찾기 위한 하나의 장치이다. 특정한 데이터 필드를 기반으로 인덱스를 만들 수 있는 것 같다.(?) 인덱스를 생성하게 되면 별도 메모리 공간에 데이터와 데이터의 물리적 주소를 함께 저장하고, 이때 데이터를 오름차순 정렬!!! 한다.

Index 사용의 장점

  • 인덱스 테이블 스캔의 경우 정렬이 되어있기 때문에 Where 절이 효율적으로 동작한다.(검색이빠르다.)
  • 정렬을 피할 수 있다. 이미 정렬되어있기 때문에
  • Min, Max가 빠르다.

Index 사용의 단점(맹점?)

  • index는 데이터 추가/수정에 약한다. 새롭게 데이터가 추가되면 정렬을 다시해야하며, 또 단순 원본테이블 뿐만 아니라 인덱스 테이블도 수정해줘야 되기 때문이다.
  • 검색하고자 하는 양의 따라서 index 검색이 더 느릴수도 있다.
  • Index를 너무 많이 만드는 것 또한 좋지 않다. 결국 Index 자체도 cost가 발생하게 되기 때문이다. 한 개의 쿼리를 위해서는 Index가 속도를 향상시킬 수 있으나, 결국 이러한 Index가 많이 쌓이면 전체적인 DB의 성능이 떨어질 수 있다.

Index 관리 구조

참고 사항 정도로 알아두자. 일반적으로 인덱스는 B+트리라는 자료구조로 이루어져 있으며, 이는 큰 대수확장성을 지녀(깊이와 리프 수의 간의 관계) 효율적으로 index를 저장해준다.

profile
(전) Junior Android Developer (현) Backend 이직 준비생

0개의 댓글