본문 바로가기

DB19

CAP 이론으로 보는 RDBMS vs NoSQL RDBMS vs NoSQL 이 글에서는 RDB와 NoSQL에 대해 알아보기 전에 CAP 이론을 살펴보고, CAP 이론을 통해 RDB와 NoSQL에서는 어떤 속성을 희생했는지에 대해서 살펴보자. CAP 이론 RDBMS와 NoSQL를 살펴볼 때 CAP이론을 살펴보면 좋다. CAP 이론은 분산 시스템에서 위 3가지 속성인 일관성(Consistency), 가용성(Availability), 분할 내성(Partition Tolerance) 중 두 가지만 동시에 보장할 수 있다는 이론이다. 즉, 완벽한 일관성, 가용성, 분할 허용성을 모두 동시에 보장하는 것은 불가능하며 다음 3가지 속성의 특징을 통해 어떠한 상황에서 속성을 희생해야 하는지에 대한 고려를 제공해준다. 하지만 완벽한 CP, AP 시스템은 사용할 수 없.. 2024. 1. 9.
인덱스를 사용하는 이유와 트레이드 오프 인덱스 인덱스는 여러 가지 방식에서 사용될 수 있다. 예를 들어, 락 관점에서 보면 인덱스가 걸려있지 않은 테이블로 WHERE 조건 검색을 하면 전체 레코드가 락이 걸리는 반면 인덱스를 통해 WHERE 조건 검색을 하면 해당 레코드만 락을 걸어 락을 최소화할 수 있다. 또한 테이블 전체 파일을 읽기 보다는 상대적으로 작은 인덱스 파일을 읽어 더 빠르게 조회를 할 수 있다. 이러한 여러 가지 장점이 있는 인덱스에 대해 알아보고, 인덱스를 사용하는 대신 그에 따른 트레이드 오프가 무엇이 있을지 살펴보자. 인덱스의 데이터 저장방식(알고리즘) 데이터 저장방식(알고리즘)별로 구분할 경우 상당히 많은 분류가 가능하지만 대표적으로 B-Tree 인덱스와 Hash 인덱스로 구분할 수 있다. B-Tree 알고리즘은 가장 .. 2023. 11. 28.
MySQL 데드락 자동 감지 및 비활성화 시 대응 데드락 데드락(Deadlock)은 데이터베이스에서 여러 트랜잭션이 서로가 가진 잠금을 기다리면서 무한정 대기하게 되어 데이터베이스의 작업이 더 이상 진행되지 않는 상황을 의미한다. 멀티 스레드(Multi-threaded) 어플리케이션에서 발생하는 데드락은 해당 어플리케이션을 완전히 멈추게 해버리기 때문에 위험하다. 따라서 데드락이 발생하면 어떻게 대응할 수 있을지를 알아야 한다. 데드락이 발생하면 어플리케이션 단에서 커넥션을 계속 물고 있고, 클라이언트 입장에서는 5초 동안 응답이 안오면 재시도할 가능성이 높다. 그러면 똑같은 레코드에 똑같은 이유로 데드락이 걸릴 확률이 높고, 커넥션 풀의 커넥션이 점점 부족해지는 문제가 발생할 가능성이 높아진다. 실제 데드락 상황이 아닐지라도 락에 대한 대기시간이 설정.. 2023. 11. 21.
슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그(Slow Query Log) 슬로우 쿼리 로그는 데이터베이스 시스템에서 실행 속도가 느린 쿼리를 식별하고 기록하는 로그 시스템을 말한다. 슬로우 쿼리 로그는 다음과 같은 상황에서 사용된다. 성능 튜닝: 데이터베이스의 성능을 향상시키기 위해 느린 쿼리를 식별하고 최적화할 때 사용된다. 문제 진단: 어떤 쿼리가 성능 이슈를 일으키는지 파악하여 해결하는데 도움이 된다. 시스템 감지: 데이터베이스 시스템을 지속적으로 감시하여 성능 저하를 미리 감지할 수 있다. 보통 DBMS의 설정에서 이를 활성화하고 관련된 옵션을 구성할 수 있다. 설정 slow_query_log 시스템 변수를 통해서 on/off할 수 있고, slow_query_log_file 시스템 변수는 슬로우 쿼리 로그 파일 경로를 나타.. 2023. 11. 14.
트랜잭션과 잠금 트랜잭션과 잠금 트랜잭션 트랜잭션은 꼭 여러 개의 변경 작업을 수행하는 쿼리가 조합됐을 때만 의미 있는 개념은 아니다. 트랜잭션은 하나의 논리적인 작업 셋에 하나의 쿼리가 있든 두 개 이상의 쿼리가 있든 관계없이 논리적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK 또는 트랜잭션을 ROLLBACK시키는 오류가 발생했을 때)함을 보장해 주는 것이다. MyISAM이나 MEMORY 스토리지 엔진처럼 부분 업데이트 현상이 발생하면 실패한 쿼리로 인해 남은 레코드를 다시 삭제하는 재처리 작업이 필요할 수 있다. 따라서 InnoDB 스토리지 엔진이 지원하는 트랜잭션 기능은 애플리케이션 개발에서 고민해야 할 문제를 줄여주는 아주 필수적인 DBMS의 기능이라.. 2023. 11. 4.
MySQL 아키텍처 MySQL 아키텍처 MySQL 서버는 사람의 머리 역할을 담당하는 MySQL 엔진과 손발 역할을 담당하는 스토리지 엔진으로 구분할 수 있다. 그리고 스토리지 엔진은 핸들러 API를 만족하면 누구든 스토리지 엔진을 구현해서 MySQL 서버에 추가해서 사용할 수 있다. 즉, MySQL 서버에서 MySQL 엔진은 하나지만 스토리지 엔진은 여러 개를 동시에 사용할 수 있다. MySQL 엔진 MySQL엔진은 클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션 핸들러와 SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룬다. 또한 MySQL은 표준 SQL(ANSI SQL) 문법을 지원하기 때문에 표준 문법에 따라 작성된 쿼리는 타 DBMS와 호환되어 실행될 수 있다. MySQL 엔진은.. 2023. 10. 24.
뷰(View) 뷰(View) 테이블은 실제로 데이터를 갖고 있지만, 뷰는 실제 데이터를 갖지 않는다. 뷰 정의(View Definition, SQL 텍스트 파일)만 갖고 있다. 쿼리에서 뷰가 사용되면 DBMS 내부적으로 질의를 재작성(Rewrite)한다. 실제 데이터를 가지고 있지 않지만 테이블의 역할을 수행한다. 가상 테이블(Virtual Table)이라고도 한다. VIEW 생성 CREATE VIEW v_palyer_team AS SELECT p.player_name, p.back_no, p.team_id, t.team_name FROM player p INNER JOIN team t ON p.team_id = t.team_id; CREATE VIEW 문을 통해 VIEW 생성를 생성할 수 있다. VIEW 확인 SEL.. 2023. 5. 23.
!= NULL, <> NULL, IS NOT NULL 차이 !=, , IS NOT 차이 의미상으로는 같지 않다를 나타내어 모두 동일한 결과를 반환할 것이라고 생각할 수 있다. 하지만,, !=, , IS NOT에는 타입 비교 대상의 범위 차이가 있다. != 와 연산자는 동일한 기능을 하며 원시 타입(Primitive Type)에 대해서만 동작하고, IS NOT NULL은 모든 타입에 대해 동작한다. !=, , IS NOT NULL 예시 != NULL을 사용한 경우 SELECT delv_msg FROM table WHERE delv_msg != NULL; != NULL을 사용한 경우에는 출력한 레코드가 없는 것을 확인할 수 있다. 와는 동일한 기능을 하기 때문에 는 넘어가겠다. IS NOT NULL을 사용한 경우 SELECT delv_msg FROM table WH.. 2023. 5. 19.
TCL(Transaction Control Language) TCL 이란? DCL(Data Control Language)에서 트랜잭션을 제어하는 명령인 COMMIT과 ROLLBACK만을 따로 분리해서 TCL이라고 한다. 트랜잭션 데이터베이스의 논리적 연산 단위 의미적으로 분할할 수 없는 최소의 단위 일반적으로 하나의 트랜잭션은 여러 SQL 문장을 포함한다. 성공 시 모든 연산을 반영, 취소 시 모든 연산을 취소한다 => All or Nothing 트랜잭션 상황 예시 도서 주문 재고 수량 감소, 주문 내역 생성 결제 포인트 적립 교통카드 충전 잔액 증가 결제 계좌 이체 원 계좌의 잔액 감소 주문 내역 생성 결제 포인트 적립 이체라는 하나의 행위를 실행하기 위해서는 한 쪽에서 잔액을 감소하고, 다른 한쪽에서 잔액을 증가시키는 두 연산이 필요하다. 트랜잭션의 특성 (.. 2023. 5. 19.