[데이터베이스] 락과 DB 회복
·
Database
개발하며 가장 고민하게 되는 문제중 하나가 바로 동시성 문제라고 생각한다. 예로, 두 트랜잭션이 동일한 데이터를 갱신할 때, 마지막 트랜잭션 내용만 반영되여 다른 트랜잭션 작업이 유실되는 문제이다.이것을 갱신손실문제라고 한다. ex) 게임을 하고있을때 피가 10인데, 치유 50과 공격 30이 동시에 들어왔는데, 가장 마지막에 들어온 공격만 들어와서 내 캐릭은 죽어버림 (치유 작업은 유실!)그럼 이러한 문제를 어떻게 해결하느냐 그 방법 바로 Lock이다. DB 락트랜잭션 간 충돌을 방지하기 위해 데이터 대한 접근을 제한한다.Shared Lock: 읽기 전용 트랜잭션을 위한 락.Exclusive Lock: 쓰기 트랜잭션을 위한 락.DB 데드락두 개 이상의 트랜잭션이 서로의 락을 기다리면서 무한 대기해결 : ..
[데이터베이스] Transaction (트랜잭션)
·
Database
트랜잭션이 뭘까?일이 처리되기 위핸 가장 작은 단위이다.내가 B라는 대상자에게 10,000원을 계좌이체 한다고 하자.1. 내 통장의 잔액 10,000원 감소2. B 통장의 잔액 10,000원 증가→ 1.인출과 2.입금이라는 두 과정이 있다.→ 1.인출만되고, 2.입금은 실패하면 치명적인 결과가 나온다.이 두 과정은 동시에 성공하던지 동시에 실패해야한다.이 두 과정을 동시에 묶는 방법이 트랜잭션이다. 즉 이것을 데이터 베이스와 어플리케이션의 데이터 거래 에 있어서 안정석을 확보하기 위한 방법이 트랜잭션이다.→ 따라서 데이터베이스에서 테이블을 읽어 온 후 다른 테이에 데이터를 입력하거나 갱신, 삭제하는 도중에 오류가 발생하면 결과를 재반영 하는 것이 아닌 모든 작업을 원상태로 복구하고, 처리 과정이 모두 성..
[데이터베이스] 이상과 정규화
·
Database
이상현상이란?이상 현상(Anomaly)테이블을 설계할 때 잘못 설계하여 데이터 삽입, 삭제, 수정할 때 논리적으로 생기는 오류삽입 이상 : 데이터를 삽입 시 불필요한 정보까지 합께 삽입된다.갱신 이상 : 데이터 갱신시 일부 튜플만 갱신되어 데이터 모순이 발생하는 현상삭제 이상 : 데이터 삭제시, 의도하지 않은 정보까지 삭제되는 현상이러한 현상을 예방하고, 효과적인 연산을 위해 데이터 정규화를 하게된다. 정규화에 알아보기 전에 함수 종속성에 대해서 먼저 알고 가야한다.함수 종속성이란?특정 속성(컬럼) A의 값이 정해지면, 다른 속성(컬럼)B의 값도 정해지는 종속 관계를 의미한다. ex) 이름과 이니셜 T.x → T.y완전 함수 종속예로, (이름, 가격, 카테고리) 라는 판매 릴레이션이 있다. 이름을 알아야..
[데이터베이스] 인덱스
·
Database
인덱스란?인덱스(index)는 데이터베이스에서 검색 성능을 높이기 위해 사용되는 자료구조이다. 인덱스는 책의 목차처럼, 특정 열(column)의 값을 기준으로 데이터를 빠르게 찾을 수 있도록 도와준다. 인덱스가 없을 경우, 데이터베이스는 풀 스캔(full scan)을 수행하게 되며, 이는 테이블의 모든 데이터를 읽어야 하기 때문에 비효율적이다.. 인덱스의 동작 방식인덱스는 키-값 쌍(key-value pair) 구조로 되어 있으며, 다음과 같은 동작 방식을 가진다.인덱스는 정렬된 상태로 유지되며, 검색 시 이진 탐색이 가능해 빠른 조회가 가능하다.데이터를 삽입하거나 삭제할 때, 인덱스도 함께 업데이트된다/인덱스는 일반적으로 B-Tree, B+Tree, Hash Table 등의 자료구조를 사용하여 구현된다..
[데이터베이스] B-Tree 인덱스와 B+Tree 인덱스
·
Database
B-Tree 인덱스와 B+Tree 인덱스B-Tree와 B+Tree는 데이터베이스 인덱스에서 많이 사용되는 자료구조이다. 특히 데이터베이스 시스템에서 빠른 검색, 삽입, 삭제가 가능하도록 설계되어있다. 두 자료구조는 유사하지만, 몇 가지 중요한 차이점이 있다. B-Tree 구조란?인덱스에 대해 알기 위해서는 먼저 B-Tree 자료구조를 알아야 한다.B-Tree는 자식 2개 만을 갖는 이진 트리(Binary Tree)를 확장하여 N개의 자식을 가질 수 있도록 고안된 것이다. 그리고 좌우 자식 간의 균형이 맞지 않을 경우에는 매우 비효율적이라, 항상 균형을 맞춘다는 의미에서 균형 트리(Balanced Tree)라고 불린다. B-Tree의 핵심은 항상 정렬된 구조로 있다는 것이다. B-Tree 인덱스B-Tree..
[데이터베이스] 순차 I/O와 랜덤 I/O
·
Database
HDD, SSD데이터 저장 매체는 대부분 컴퓨터에서 느린 Disk(디스크)이다.때문에 데이터베이스 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐이다.초당 처리 횟수를 분석하였을 때, Flash Memory를 사용하는 SSD는 HDD에 비해 엄청난 속도 차이를 보인다. 이 때문에 SSD는 DBMS로 사용할 서버로 많이 사용된다. HDD의 경우디스크에서 데이터를 읽어올 때, 하드 디스크의 드라이브 플래터(원판)을 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더(disk arm)을 이동 시킨 다음 데이터를 읽어온다. 순차 I/O 의 경우 원판을 돌려 읽어야 할 데이터가 저장된 위치까지 디스크 헤더를 이동시킨 다음 순차적으로 데이터를 읽으면 된다. 하지만 랜점 I/O의 경우 디스크 헤더의 위치, 이동횟수에서..
[데이터베이스] Pagination 구현 SQL
·
Database
Pagination 의 경우 사용하는 DB에 따라 달라질 수 있다일반적으로 SQL에서 사용하는 방식은 LIMIT과 OFFSET을 사용하여 특정 범위의 레코드를 조회하는 것이다.각 페이지에 해당하는 데이터만을 가져와 효율적인 데이터 전송과 조회를 할 수 있습니다.MySQL을 기준으로 작성한 쿼리 예시SELECT * FROM UESRORDER BY created_date DESCLIMIT 10 OFFSET 0;LIMIT : 조회할 레코드 수를 지정OFFSET : 건너 뛸 레코드 수를 지정 OFFSET 0 은 첫번째 부터 시작Pagination의 한계점 과 고려사항큰 OFFSET 성능 문제 : 페이지 수가 증가할 수 록 성능 저하가 발생할 수 있습니다.인덱스 기반 Pagination 이나, 커서 기반 방식으로..
[데이터베이스] SQL 안티패턴
·
Database
SQL 안티패턴에 대해서 알아보자 전체 조회SELECT * FROM USERS -- 안티패턴SELECT ID, NAME, EMAIL FROM USERS -- 권장SELECT *는 불필요한 데이터 전송을 발생 시키고, 테이블 구조 변경 시 예기치 못한 오류가 발생할 수 있습니다. 필요한 컬럼만 명시적으로 지정해야합니다.문자열 연결로 동적 쿼리 생성-- 안티패턴name = request.getParameter("name")sql = "SELECT * FROM USER WHERE NAME = '"+name+"'"; --안티패턴-- 권장sql = "SELECT * FROM USER WHERE NAME = ?";pstmt = conn.prepareStatement(sql);pstmt.setString(1,name..