728x90
Database
31

[DATABASE] Partitioning, Sharding, Replication

Partitioning partitioning은 다음과 같이 vertical partitioning과 horizontal partitioning으로 나눌 수 있다. vertical partitioning horizontal partitioning column을 기준으로 table을 나누는 방식 row를 기준으로 table을 나누는 방식 Vertical Partitioning 예를 들어 Article이라는 게시글관련 테이블이 있다고 해보자. id title writer_id created_at read_cnt comment_cnt content ... ... ... ... ... ... ... 만약 게시글들을 조회해야할 경우 content attribute는 필요가 없고 id, title, writer_i..

Database 2023.12.23

[DATABASE] INDEX(인덱스)

인덱스가 걸려있지 않을 경우 일반적인 SELECT-WHERE문을 실행하면 하나씩 순차적으로 탐색하게된다. 즉, 시간복잡도가 O(N)을 가지며 이를 full scan(table scan)이라고 부른다. 반면에 인덱스(B-tree based index)가 걸려있다면 시간복잡도는 O(logN)을 가지게되어 full scan보다 더 빠르게 찾을 수 있다. 이렇게 인덱스를 빠르게 조회하기 위해 사용할 수 있을 뿐만아니라 빠르게 정렬(order by)하거나 그룹화(group by)하기위해서도 사용할 수 있다. 인덱스 생성 CREATE INDEX {index_name} ON {table} ({attribute}); 두 개 이상의 attribute를 사용할 경우 다음과 같이 작성할 수 있다. CREATE UNIQUE ..

Database 2023.12.16

[DATABASE] 정규화(Normalization)

정규화는 데이터 중복과 insertion, update, deletion anomaly를 최소화하기 위해 일련의 normal forms(NF)에 따라 relational DB를 구성하는 과정을 말한다. 이때 normal form(NF)이란 정규화되기 위해 준수해야하는 각각의 rule들을 의미한다. 정규화 과정 Init table부터 순차적으로 진행하며 normal form을 만족하지 못하면 만족하도록 테이블 구조를 조정한다. 그리고 선행 단계를 만족해야 다음 단계로 진행할 수 있다. 1NF ~ BCNF까지는 FD와 key만으로 정의되는 normal form이며 3NF까지 도달하면 정규화되었다고 말하기도 한다. 정규화 예시 Schema bank_name account_num account_id class ..

Database 2023.12.15

[DATABASE] Functional Dependency(FD)

article_id title content category user_id article_id를 집합 X, title, content, category를 집합 Y라고 하자. 이때 X값에 따라 Y값이 유일하게 결정된다고 볼 수 있다. 또한 이러한 것을 X가 Y를 함수적으로 결정한다. 또는 Y가 X에 함수적으로 의존한다.라고 말할 수 있으며 Functional Dependency(FD)라고 부른다. X -> Y로 표현할 수 있으며 X는 left-hand side, Y는 right-hand side라고 한다. 추가 예시 {stu_id} -> {stu_name, birth_date, address} {class_id} -> {class_name, year, semester, credit} {stu_id, cla..

Database 2023.12.13

[DATABASE] MVCC (MultiVersion Concurrency Control)

같은 데이터에 대해서 서로 다른 트랜잭션이 동시에 write를 하는 것만 허용을 하지 않고 그 외에 read/write 또는 read/read하는 경우를 허용한다. 따라서 Lock을 사용했을 때보다 처리량이 많아진다. MVCC? 데이터를 읽을 때 특정 시점(Isolation Level)을 기준으로 가장 최근에 commit된 데이터를 읽는다. 또한 데이터가 변할 때 이력을 따로 저장하여 관리한다. x=10일 때 다음 작업을 수행한다고 해보자. (lock, unlock은 생략) transaction1 transaction2 write(x=50) read(x) => 10 commit read(x) => 50 transaction2에서 write(x=50)을 수행하면 별도의 공간에 변경된 값을 저장한다. MV..

Database 2023.12.10

[DATABASE] LOCK (2PL Protocol)

x=10이라는 데이터가 있을 경우 다음과 같은 작업을 진행할 경우 잘못된 동작을 일으킬 수 있다. transaction1 transaction2 write(x=20) write(x=90) 이런 잘못된 동작을 해결하기위해 Lock을 사용할 수 있다. Write Lock (Exclusive Lock) 다른 transaction이 같은 데이터를 데이터를 read/write하는 것을 허용하지 않는다. transaction1 transaction2 write_lock(x) write_lock(x) write(x=20) unlock(x) write(x=90) unlock transaction1에서 lock을 획득 transaction2는 trancation1에서 unlock을 할때까지 대기 transaction1에..

Database 2023.12.07

[DATABASE] Isolation Level

Dirty Read x = 10, y = 20 일 때 다음 작업을 수행한다고 해보자. transaction 1 transaction 2 read(x) => 10 write(y=70) read(y) => 70 write(x=80) commit rollback(y=20) 그러면 최종적으로 x = 80, y = 20이 되는데 이 때 x는 commit되지 않은 y를 read하여 얻은 결과이다. 이렇게 commit되지 않은 값을 읽는 것을 Dirty Read라고 부른다. Rollback이 일어나지 않은 다른 경우에도 Dirty Read라고 부를 수 있는데 먼저 x = 50, y = 50 일 때 다음 작업을 수행한다고 해보자. transaction 1 transaction 2 read(x) => 50 write(x..

Database 2023.12.05

[DATABASE] Concurrency Control (Schedule, Serializability, Recoverability)

Schedule 여러 transaction들이 동시에 실행될 때 각 transaction에 속한 operation들의 실행 순서를 말한다. read를 r, write를 w, commit을 c라고 표현했을 때 다음과 같이 case 별로 실행 순서를 작성할 수 있다. case 1: r1(K) -> w1(K) -> r1(H) -> w1(H) -> c1 -> r2(H) -> w2(H) -> c2 case 2: r2(H) -> w2(H) -> c2 -> r1(K) -> w1(K) -> r1(H) -> w1(H) -> c1 case 3: r1(K) -> w1(K) -> r2(H) -> w2(H) -> c2 -> r1(H) -> w1(H) -> c1 case 4: r1(K) -> w1(K) -> r1(H) -> r2..

Database 2023.12.04

[DATABASE] Transaction (트랜잭션)

Transaction? A에서 B로 5000원 계좌이체를 한다고할때 다음 2가지 작업이 필요할 것이다. A의 잔고 5000원 감소 B의 잔고 5000원 증가 만약 1번 작업은 성공했고 2번에서 문제가 발생하여 실패한다면 A만 5000원이 감소하게될 것이다. 이를 해결하기위해 트랜잭션은 1, 2 모두 성공해야 작업을 완료하고 둘 중에 하나라도 실패하면 거래 전의 상태로 되돌려준다. 이때 모든 작업이 성공해서 데이터베이스에 정상 반영하는 것을 commit, 하나라도 실패해서 작업 이전으로 되돌리는 것을 rollback 이라 한다. Commit START TRANSACTION; UPDATE account SET balance = balance - 5000 WHERE id = 'A'; UPDATE account..

Database 2023.12.02

[DATABASE] Trigger

데이터베이스에서 변경이 발생했을 때 실행되는 Procedure를 의미 예시1 delimiter $$ CREATE TRIGGER log_user_nickname_trigger BEFORE UPDATE ON users FOR EACH ROW BEGIN INSERT INTO users_log VALUES(OLD.id, OLD.nickname, now()); END $$ delimiter; BEFORE UPDATE ON users FOR EACH ROW는 users 테이블에 각 row에서 update가 일어나기 전에 수행해야한다는 것을 의미한다. OLD는 update 전 users의 tuple을 가르킨다. 예시2 delimiter $$ CREATE TRIGGER sum_buy_prices_trigger AFT..

Database 2023.12.01
728x90