데이터베이스 7

InnoDB 스토리지 엔진 아키텍처

프라이머리 키에 의한 클러스터링 프라이머리 키는 다른 보조 인덱스에 비해 높은 비중 다른 인덱스는 프라이머리 키를 논리적인 주소로 활용 외래키 외래키 지원함 다만 데이터의 수정이 다른 테이블로 전파되므로, 데드락 등의 잠금이 발생할 가능성이 큼 MVCC 멀티버전: 하나의 레코드에 여러 개의 버전이 동시에 관리 목적: 잠금을 사용하지 않는 일관된 읽기 제공 레코드가 트랜잭션 중에 읽기 요청이 발생할 경우, 격리 수준에 따라 제공되는 값이 다름 READ_UNCOMMITED: 트랜잭션에 의해 변경된 값을 반환 REPEATABLE_READ, SERIALIZABLE: 트랜잭션 이전의 값을 반환 잠금 없는 일관된 읽기 MVCC 기술을 이용해 트랜잭션 중이더라고 잠금 없이 읽기가 가능 격리수준에 따라 읽기 명령의 값..

데이터베이스 2023.02.21

MySQL 아키텍처

MySQL 엔진 아키텍처 MySQL 서버는 크게 MySQL 엔진과 스토리지 엔진으로 구분할 수 있음 MySQL엔진은 클라이언트로부터 접속 및 쿼리요청을 처리하는 커넥션 핸들러 부분과 SQL 파서 & 옵티마이저 등으로 구성 스토리지 엔진은 데이터를 디스크 스토리지에 저장하거나 읽는 등의 작업을 처리 스토리지 엔진은 여러 개를 동시에 사용할 수 있음 핸들러 API는 스토리지 엔진과 MySQL 엔진의 사이에 존재하며, 각 요청을 주고받을 때 사용됨 MySQL 스레딩 구조 MySQL 서버는 프로세스 기반이 아닌 스레드 기반 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있음. 동일한 기능을 수행하는 스레드를 여러 개 포크해서 병렬처리도 가능 포그라운드 프로세스 최소 MySQL 서버에 접속된 클라이언트 수만큼..

데이터베이스 2023.02.06

트랜잭션

사실 데이터베이스 강의를 수강한 큰 이유는 트랜잭션에 대해 잘 알고자 하기 위함이었다. 따라서 SQL 강의중에서 트랜잭션과 관련한 비중이 가장 큰 강의를 수강하였는데.. 결과적으로는 학습내용을 더 보충하여야 하지 않을까 싶다. 일단 트랜잭션에 대해 알아보아야 할 것 같다. 트랜잭션은 데이터베이스에서 상호작용의 단위로, 모든 작업이 성공하거나 모든 작업이 실패해야한다. 보통 대부분 은행 송금과 같은 예제를 많이 사용하므로, 본 글에서도 송금에 대한 예제를 사용하도록 하겠다. 아래와 같이 계좌이체 프로세스가 진행된다고 하자. 발신 계좌에서 송금 금액만큼 차감하고 수신계좌에서 송금금액만큼 추가하는 프로세스가 있을 텐데, 이 때 송금 금액만큼 차감은 진행되었는데, 수신계좌에서 추가하는 프로세스가 실패하였을 경우..

서브쿼리

서브쿼리란 하나의 쿼리문 안에 포함되어 있는 또 하나의 쿼리문으로, 여러번의 쿼리를 수행해야만 얻을 수 있는 결과를 하나의 중첩된 쿼리로 처리할 수 있다. SELECT 절에서의 서브쿼리 SELECT cd_plant, nm_plant, (SELECT AVG(um) FROM table_item) AS um FROM table_plant FROM 절에서의 서브쿼리 SELECT cd_plant, nm_plant, am FROM (SELECT * FROM table_plant) AS a WHERE절에서의 서브쿼리 SELECT cd_plant, nm_plant, FROM table_plant WHERE cd_plant IN (SELECT cd_plant FROM table_plant WHERE plant='1000..

Join

Cross Join 모든 경우의 수를 보여주는 Join SELECT * FROM customers, cars Inner Join 두 테이블 조건절을 통해 일치하는 경우에만 Join 실행 SELECT * FROM customers, cars WHERE customers.id = cars.customer_id 혹은 SELECT * FROM customers INNER JOIN cars ON customers.id = cars.customer_id 혹은 SELECT * FROM customers AS a, cars AS B WHERE a.id = b.customer_id Outer Join 조건에 해당하지 않는 결과라도 조회가 가능하도록 JOIN 처리 조건에 해당하지 않는 열값은 Null 처리됨 SELECT ..

기본적인 쿼리문

DML(Data Manipulation Language) INSERT 문: 데이터 입력시 사용 INSERT INTO table_name (col1, col2, col3) VALUES(value1, value2, value3) SELECT 문을 사용하는 응용도 가능 INSERT INTO table2 (col1, col2) SELECT col1, col2 FROM table1 WHERE id>5; DELETE 문: 데이터 삭제시 사용. 주의하여 사용하여야 하며 트랜잭션을 사용할 것을 권장 DELETE table_name WHERE id=1; UPDATE 문: 기존의 레코드를 변경할 때 사용 UPDATE table_name SET col1=value1, col2=value2 WHERE id>5; DQL(Dat..

개요(데이터베이스를 공부하기로 시작한 이유)

백엔드에 입문한 이래로, 계속하여 대용량 데이터 혹은 대용량 트래픽처리는 어떻게 하는 것인가에 대한 생각을 하고 있다. 백엔드 개발자로써 모든 능력이 중요하겠지만, 대용량 트래픽을 감당할 수 있는 아키텍처 설계 및 구현보다 더 중요한 능력은 없다고 생각하기 때문이다. 아마 이는 병렬컴퓨팅과 비슷한 내용일 것이다. 병렬컴퓨팅은 여러 컴퓨터를 사용하여 하나의 거대한 계산을 처리하는 컴퓨팅 방법으로, 병목현상이 어디서 발생하는 지, 어떤 오버헤드가 발생할 지에 대해 끊임없이 생각하여야 한다. 물론 코드의 계산 효율을 고려하는 것은 당연시해야 한다. 아직은 잘은 모르겠지만, 대용량 트래픽 처리 역시 서비스에서 발생하는 병목지점을 찾고 이를 해결하는 방법에서 시작하리라 믿는다. 현재 존재하는 대부분의 어플리케이션..