본문 바로가기

DB 공부

Database

반응형

데이터베이스를 사용하는 이유

데이터베이스가 존재하기 이전에는 파일 시스템을 이용하여 데이터를 관리하였다. (현재도 부분적으로 사용됨) 데이터를 각각의 파일 단위로 저장하며 이러한 일들을 처리하기 위한 독립적인 애플리케이션과 상호 연동이 되어야 한다. 이 때의 문제점은 데이터 종속성 문제와 중복성, 데이터 무결성이다.

데이터베이스의 특징

  1. 데이터의 독립성
    • 물리적 독립성: 데이터베이스 사이즈를 늘리거나 성능 향상을 위해 데이터 파일을 늘리거나 새롭게 추가하더라도 관련된 응용 프로그램을 수정할 필요가 없음.
    • 논리적 독립성: 데이터베이스는 논리적인 구조로 다양한 응용 프로그램의 논리적 요구를 만족시켜줄 수 있다.
  2. 데이터의 무결성: 여러 경로를 통해 잘못된 데이터가 발생하는 경우의 수를 방지하는 기능으로 데이터의 유효성 검사를 통해 데이터의 무결성을 구현하게 된다.
  3. 데이터의 보안성: 인증된 사용자들만 db나 db내의 자원에 접근할 수 있도록 계정 관리 또는 접근 권한을 설정함으로써 모든 데이터에 보안을 구현할 수 있다.
  4. 데이터 일관성 연관된 정보를 논리적인 구조로 관리함으로써 어떤 하나의 데이터만 변경했을 경우 발생할 수 있는 데이터의 불일치성을 배제할 수 있다. 또한 작업 중 일부데이터만 변경되어 나머지 데이터와 일치하지 않는 경우의 수를 배제할 수 있다.
  5. 데이터 중복 최소화 데이터베이스는 데이터를 통합해서 관리함으로써 파일 시스템의 단점 중 하나인 자료의 중복과 데이터의 중복성 문제를 해결할 수 있다.

쿼리 튜닝: 랜덤I/O 자체를 줄여주는 것이 목적이라고 할 수 있다.

정규화

중복된 정보로 인해 갱신 이상이 발생하게 된다. 동일한 정보를 한 릴레이션에서는 변경하고, 나머지 릴레이션에서는 변경하지 않은 경우 어느 것이 정확한지 알 수 없게 되는 것임.

1-1. 갱신 이상

  • 삽입 이상: 원하지 않는 자료가 삽입, 삽입하는데 자료가 부족해 삽입이 되지 않는 문제.
  • 삭제 이상: 하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점을 말함.
  • 수정 이상: 정확하지 않거나 일부의 튜플만 갱신되어 정보가 모호해지거나 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점

정규화란?

관계형 데이터베이스에서 중복을 최소하하기 위해서는 데이터를 구조화하는 작업이다. 좀 더 구체적으로는 불만족스러운 나쁜 릴레이션의 애트리뷰트들을 나누어서 좋은 작은 릴레이션으로 분해하는 작업을 말함.

  • 엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성(Functional Despendency)을 판단함. 판단된 함수적 종석성은 좋은 릴레이션 설계의 정형적 기준으로 사용된다. 즉, 각각의 정규형마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의되고, 그 정규형을 만족하지 못하는 정규형을 나쁜 릴레이션으로 파악함.

  • 함수적 종송석: 애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건의 일종이다. x와 y를 임의의 애트리뷰트 집합이라고 할 때, x의 값이y의 값을 유일하게 결정한다면

index

왜 인덱스 구조에 b-tree를 사용하는가?
데이터에 접근하는 시간복잡도가 O(1)인 hash table이 더 효율적이라고 생각할 수 있다. hash table을 사용하게 된다면 등호(=) 연산이 아닌 부등호 연산의 경우에 문제가 발생한다. 동등 연산(=)에 특화된 hash table은 데이터베이스의 자료구조로 적합하지 않는다.

100000레코드에 해당하는 테이블에 대해서 2000 단위로 성별에 인덱스를 생성했다고 가정하면, 값의 range가 적은 성별은 인덱스를 읽고 다시 한 번 디스크 I/O가 발생하기 때문에 비효율적이다.

primary index vs. secondary index

partition, partition key

컬럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 인덱스를 만들어 둔다.

RAID

transacion

작업의 완전성을 보장해주는 것. 논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다. 사용자의 입장에서는 작업의 논리적 단위로 이해를 할 수 있고, 시스템의 입장에서는 데이터들을 접근 또는 변경하는 프로그램의 단위가 된다.

트랜잭션은 데이터의 정합성을 보장하기 위한 기능이고, 잠금은 동시성을 제어하기 위한 기능이다. 잠금은 여러 커넥션에서 동이세 동일한 자원을 요청할 경우 순서대로 한 시점에서 하나의 커넥션만 변경할 수 있게 해주는 역할을 한다. 여기서 자원은 레코드나 테이블을 말한다. 이와는 조금 다르게 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합되었을 때만 의미있는 개념은 아니다.

acid

  1. atomicity
    all or nothing. 트랜잭션이 한 번 실행되면 작업을 끝마치거나 혹은 아예 시작하면 안된다. 만약 트랜잭션 중간에 어떠한 문제가 발생한다면 트랜잭션에 해당하는 어떠한 작업 내용도 수행되어서는 안되며 아무런 문제가 발생되지 않았을 경우에만 모든 작업의 수행되어야 한다.

  2. consistency
    데이터에는 정해진 형식만이 들어갈 수 있음.
    트랜잭션이 완료된 다음의 상태에서도 트랜잭션이 일어나기 전의 상황과 동일하게 데이터의 일관성을 보장해야 한다.

  3. isolation
    다른 트랜잭션이 또 다른 트랜잭션을 방해할 수 없다.
    각각의 트랜잭션은 서로 간섭없이 독립적으로 수행되어야 한다.

  4. durability
    트랜잰셕의 결과는 영구적으로 저장이 되어야 한다.
    트랜잭션이 정상적으로 종료된 다음에는 영구적으로 데이터베이스에 작업의 결과가 저장되어야 한다.

mariadb의 lock

교착 상태의 빈도를 낮추는 방법

  1. 트랜잭션을 자주 커밋한다.
  2. 정해진 순서로 테이블에 접근한다. 위에서 트랜잭션 1 이 테이블 b -> a의 순으로 접근했고, 트랜잭션 2는 테이블 a -> b 순으로 접근했다. 트랜잭션들이 동일한 테이블 순으로 접근하게 한다.
  3. 읽기 잠금 획득(select ~ for update) 의 사용을 피한다.
  4. 한 테이블의 복수 행을 복수의 연결에서 순서 없이 갱신하면 교착상태가 발생하기 쉽다. 이 경우에는 테이블 단위의 잠금을 획득해 갱신을 직렬화하면 동시성은 떨어지지만 교착상태를 회피할 수 있다.

CAP

  1. Consistency
    같은 시간에 조회하는 데이터는 항상 동일한 데이터임을 보증하는 것을 의미함.(분산된 데이터들의 일관성). RDBMS에서는 가장 기본적인 기능이지만, 일관성을 지원하지 않는 NoSQL에서는 데이터 일관성이 느슨하게 처리되어 동일한 데이터가 나타나지 않을 수 있다. 느슨하게 처리된다는 것은 데이터의 변경을 시간의 흐름에 따라 여러 노드에 전파하는 것을 말한다. 이러한 방법을 최종적으로 일관성이 유지된다고 하여 최종 일관성 또는 궁극적 일관성을 지원하다고 한다.

첫번째로 데이터의 저장 결과를 클라이언트로 응답하기 전에 모든 노드에 데이터를 저장하는 동기식 방법. 두 번 째로 메모리나 임시 파일에 기록하고 클라이언트에 먼저 응답한 다음, 특정 이벤트 또는 프로세스를 사용하여 노드로 데이터를 동기화하는 비동기식 방법이 있다.

  1. Availability
    가용성이란 모든 클라이언트의 읽기와 쓰기 요청에 대하여 항상 응답이 가능해야 함을 보증하는 것이며 내고장성이라고도 한다. 내고장성을 가진 NoSQL은 클러스터 내에서 몇 개의 노드가 망가지더라도 정상적인 서비스가 가능하다.

몇몇 NoSQL은 가용성을 보장하기 위해 데이터 복제를 사용한다. 동일한 데이터를 다중 노드에 중복 저장하여 그 중 몇대의 노드가 고장나도 데이터가 유실되지 않도록 하는 방법. 데이터 중복 저장 방법에는 동일한 데이터를 가진 저장소를 하나 더 생성하는 Master-Slave 복제 방법과 데이터 단위로 중복 저장하는 Peer-to-Peer 복제 방법이 있다.

  1. 네트워크 분할 허용성(Partition tolerance)
    지역적으로 분할된 네트워크 환경에서 동작하는 시스템에서 두 지역 간의 네트워크가 단절되거나 네트워크 데이터의 유실이 일어나더라도 각 지역의 시스템은 정상적으로 동작해야 함을 의미함.

index 통계정보

statement vs. prepared statement

속도 면에서 preparedstatement가 빠르다고 알려져있다. 쿼리를 수행하기 전에 이미 쿼리가 컴파일 되어 있으며, 반복 수행의 경우 프리 컴파일된 쿼리를 통해 수행이 이루어지기 때문이다.

PreparedStatement에는 보통 변수를 설정하고 바인딩하는 static sql 이 사용되고 Statement에서는 쿼리 자체에 조건이 들어가는 dynamic sql 이 사용된다. PreparedStatement가 파싱 타임을 줄여주는 것은 분명하지만

성능을 고려할 때 시간적인 부분에서 가장 큰 비중을 차지하는 것은 테이블에서 레코드(row)를 가져오는 과정이고 SQL 문을 파싱하는 시간은 이 시간의 10분의 1에 불과하다. 그렇기 때문에 SQL Injection 등의 문제를 보완해주는 PreparedStatement를 사용하는 것이 옳다.

galera cluster

heart beat check 없음 .
cluster에서 나오면 바로 죽어버리는 것. --> C를 보존하기 위해서 P를 희생함, A가 죽어도 1, 2 3 중 2가 죽어도 계속 진행 가능.
<-> P를 지키기 위해서 A를 보존하는 경우는?

반응형

'DB 공부' 카테고리의 다른 글

MongoDB (root) 계정 만들기  (0) 2020.05.05
macOS mongoDB 설정  (0) 2020.05.05
Neo4j - Cypher 언어  (0) 2020.03.24
Neo4j 개요  (0) 2020.03.22