delpho

DB에 대하여 - 1 본문

CS

DB에 대하여 - 1

delpho 2022. 6. 19. 17:13

_1. 데이터베이스에서 인덱스를 사용하는 이유 및 장단점에 대해 설명해주세요.

 

더보기

데이터베이스에서 인덱스를 사용하는 이유는 검색 성능을 향상시키기 위함이다.
(검색 성능을 실질적으로 향상시키기 위해서 해당 쿼리가 index를 사용하는지, 카디널리티 또는 selectivity와 같은 요소들이 고려된 인덱스가 생성되어야 한다.)
인덱스를 사용하여 얻을 수 있는 장점으로는 빠른 검색 성능이 있고, 단점으로는 인덱스를 구성하는 비용 (추가, 수정, 삭제 연산시 인덱스를 형성하기 위해 필요한 추가적 연산)이다.
인덱스를 생성할 때 트레이드 오프 관계에 놓여있는 요소들을 종합적으로 고려하여 생성해야 한다.

 

 

 

 

# 인덱스란?

  • 데이터베이스의 테이블에 대한 검색 속도를 향상시켜주는 자료구조
  • 테이블의 특정 컬럼(Column)에 인덱스를 생성하면해당 컬럼의 데이터를 정렬한 후 별도의 메모리 공간에 데이터의 물리적 주소와 함께 저장된다. 컬럼의 값과 물리적 주소를 (key, value)의 한 쌍으로 저장한다. 
  • 인덱스 = 책의 목차 / 물리적 주소 = 책의 페이지 번호 / 데이터 = 책의 내용 이라고 생각가능!
     

 

 

# 인덱스 사용시의 장점

  1. 테이블을 검색하는 속도와 성능이 향상
    • 기존엔 Where문으로 특정 조건의 데이터를 찾기 위해서 테이블의 전체를 조건과 비교해야 하는 '풀 테이블 스캔(Full Table Scan)' 작업이 필요했는데, 인덱스를 이용하면 데이터들이 정렬되어 있기 때문에 조건에 맞는 데이터를 빠르게 찾을 수 있다. 
    • ORDER BY 문이나 MIN/MAX 같은 경우도 이미 정렬이 되어 있기 때문에 빠르게 수행 가능!
    • 그에따라 시스템의 전반적인 부하 감소!

 

 

# 인덱스 사용시의 단점

  1. 인덱스를 관리하기 위한 추가 작업이 필요
    • 인덱스가 적용된 Column에
    • INSERT 연산을 수행하면 👉 새로운 데이터에 대한 인덱스를 추가 하는 연산이 필요하다.
    • DELETE 연산을 수행하면 👉 삭제하는 데이터의 인덱스를 사용하지 않는 처리가 필요하다.
    • UPDATE 연산을 수행하면 👉 기존 인덱스를 사용하지 않게 처리하고, 갱신된 데이터에 대한 인덱스를 추가하는 처리가 필요
  2. 추가 저장 공간 필요
    • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요
  3. 잘못 사용하는 경우 오히려 검색 성능 저하
    • CREATE, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸게 되면 👉 인덱스의 크기가 비대해져서 성능이 오히려 저하된다
    • 인덱스가 적용된 Column에 DELETE, UPDATE 연산을 하면 기존의 인덱스를 삭제하지 않고 사용하지 않음 처리를 해주기 때문에 인덱스 크기가 비대해진다.

 

 

 

# 효율적인 인덱스 생성 전략

  • 고유한 값을 많이 가지는 Column(Primary Key)을 인덱스로 사용한다.
  • WHERE절에 자주 사용되는Column을 인덱스로 사용한다
  • INSERT, DELETE, UPDATE 가 자주 발생하지 않은 Column을 인덱스로 사용한다
  • JOIN, WHERE, ORDER BY 에 자주 사용되는 Column을 인덱스로 사용한다
  • 데이터 중복도가 낮은 Column을 인덱스로 사용한다

 

# 인덱스를 사용하면 좋은 경우

  • 규모가 작지 않은 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼
  • 기타 등등

 

 


_2. 트랜잭션에 대해서 설명해주세요.

 

더보기

트랜잭션이란 데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위이다.
트랜잭션에는 여러 개의 연산이 수행될 수 있고, 수행중에 한작업이라도 실패하면 전부를 rollback하고 모두 성공해야 commit한다.

 

 

 

 

# 트랜잭션이란

  • 데이터베이스의 상태를 변경시키기 위해 수행하는 작업 단위
    • DB의 상태를 변경시킨다는건?
      • 질의어(SQL)를 이용하여 데이터베이스를 접근 하는 것을 의미
    • 작업 단위란?
      • 사용자가 특정 기능의 수행을 위해 SQL 작업을 묶은 단위
  • 수행중에 실행이 중단된 경우 Rollback을 수행하고 오류 없이 실행을 마치면 Commit을 수행
    • Commit 연산 : 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산
    • Rollback 연산 : Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산

 

 


_3. ACID에 대해서 설명해주세요.

 

# 트랜잭션의 특징 ( ACID)

더보기

원자성 (Atomicity)

일관성 (Consistency)

독립성 (Isolation)

지속성 (Durability)

  • 원자성 (Atomicity)
    • 트랜잭션이 데이터베이스에 모두 반영되던가, 아니면 전혀 반영되지 않아야 한다는 것
  • 일관성 (Consistency)
    • 트랜잭션의 작업 처리 결과가 항상 일관성이 있어야 한다는 것
      • ex. 트랜잭션이 진행되는 동안에 데이터베이스가 변경 되더라도 업데이트된 데이터베이스로 트랜잭션이 진행되는것이 아니라,처음에 트랜잭션을 진행 하기 위해 참조한 데이터베이스로 진행된다. 이렇게 함으로써 각 사용자는 일관성 있는 데이터를 볼 수 있는 것이다.
  • 독립성 (Isolation)
    • 둘 이상의 트랜잭션이 동시에 실행되고 있을 경우 어떤 하나의 트랜잭션이라도, 다른 트랜잭션의 연산에 끼어들 수 없다는 점
      • 하나의 특정 트랜잭션이 완료될때까지다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.
  • 지속성 (Durability)
    • 트랜잭션이 성공적으로 완료됬을 경우, 결과는 영구적으로 반영되어야 한다는 점

 

 


_4. 트랜잭션 격리 수준(Transaction Isolation Levels)에 대해서 설명해주세요.

 

 

# 트랜잭션 격리 수준이란

트랜잭션들끼리 얼마나 고립되어있는지 (잠금수준)를 나타내는 것

특정 트랜잭션이 다른 트랜잭션에 의해 변경된 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것

 

 

# 트랜잭션 격리 수준이 필요한 이유

  • 트랜잭션이 시작된 시점으로부터 일관성 있게 데이터를 읽어 들이는 것
  • 하나의 트랜잭션이 진행되는 동안 다른 트랜잭션에의해 변경사항이 발생하더라도 이를 무시하고 계속 일관성 있는 데이터를 보여준다. (물론 트랜잭션 자신이 발생한 변경사항은 읽을 수 있다)

 

 

 

# 격리수준 종류

  • 크게 4가지, 아래로 내려갈수록 트랜잭션 간의 고립도가 높아지고 성능이 떨어지는게 일반적이다.
더보기

READ UNCOMMITTED (트렌젝션 레벨 0)
READ COMMITTED (트렌젝션 레벨 1)
REPEATABLE READ (트렌젝션 레벨 2)
SERIALIZABLE (트렌젝션 레벨 3)

  • READ UNCOMMITTED (트렌젝션 레벨 0)
    • 어떤 트랜잭션의 변경내용이 COMMIT이나 ROLLBACK과 상관없이 다른 트랜잭션에서 보여진다.
    • Dirty Read, Non-Repeatable Read, Phantom Read 현상이 발생
    • 데이터 정합성에 문제가 많다. 그렇기에 RDBMS 표준에서는 격리수준으로 인정하지 않는다.
더보기

예시

  • 트랜잭션A는 테이블의 데이터를 수정중인 상태이고 아직 COMMIT 전이다.
  • 트랜잭션B는 트랜잭션A가 수정중인 데이터를 조회한다. (이를 Dirty Read라고 한다.)
  • 트랜잭션A는 문제가 발생해 ROLLBACK한다.
  • 하지만 트랜잭션B는 COMMIT되지 않은 데이터를 가지고 로직을 수행한다. (문제 발생)

 

 

  • READ COMMITTED (트렌젝션 레벨 1)
    • RDB에서 대부분 기본적으로 사용되고 있는 격리 수준
    • 어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있다.
  • REPEATABLE READ (트렌젝션 레벨 2)
    • 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준
  • SERIALIZABLE (트렌젝션 레벨 3)
    • 트랜잭션에 진입하면 락을 걸어 다른 트랜잭션이 접근하지 못하게 한다

 

 

 

 

 

 

 

 

출처

https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%97%90%EC%84%9C-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

[데이터베이스] 데이터베이스에서 인덱스를 사용하는 이유

https://github.com/guswns3371/backend-interview-questionhttps://mangkyu.tistory.com/96https://coding-factory.tistory.com/746https:

velog.io

https://rebro.kr/167

 

[DB] 11. 인덱스(Index) - (1) 개념, 장단점, B+Tree 등

[목차] 1. 인덱스(Index)란? 2. 인덱스(Index)의 장단점 3. 인덱스를 사용하면 좋은 경우 4. 인덱스의 자료 구조 1. 인덱스(Index)란? 인덱스(Index)는 데이터베이스의 테이블에 대한 검색 속도를 향상시켜

rebro.kr

https://siahn95.tistory.com/entry/DB-%EC%9D%B8%EB%8D%B1%EC%8A%A4%EB%9E%80-1-%EA%B0%9C%EB%85%90-%EC%9E%A5%EB%8B%A8%EC%A0%90-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0

 

[DB] 인덱스란? - (1) 개념, 장단점, 쓰는 이유

Index(이하 인덱스)는 DB를 다루다 보면 필연적으로 듣는 단어이다. 본격적으로 글에 들어가기 전에 인덱스에 대해 간단하게 설명하자면, DB 데이터 조회 성능 향상을 위해 사용한다. 대용량 데이

siahn95.tistory.com

https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-ACID

 

[데이터베이스] 트랜잭션, ACID

https://github.com/guswns3371/backend-interview-questionhttp://elearning.kocw.net/document/lec/2011_2/dunksung/ParkUchang/09.pdfhttps:/

velog.io

https://mommoo.tistory.com/62

 

트랜잭션(Transaction)이란?

트랜잭션이란? 트랜잭션(Transaction 이하 트랜잭션)이란, 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다. 데이터베이스의 상태를 변화시킨다는 것은 무얼 의미하는 것일

mommoo.tistory.com

https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC%EC%88%98%EC%A4%80

 

[데이터베이스] 트랜잭션 격리수준

https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/https://mozi.tistory

velog.io

https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/

 

'CS' 카테고리의 다른 글

네트워크에 대하여 - 2  (0) 2022.06.25
네트워크에 대하여 - 1  (0) 2022.06.22
Spring에 대하여 - 5  (0) 2022.06.19
Java에 대하여 - 4  (0) 2022.06.10
Java에 대하여 - 3  (0) 2022.06.10