Database
[Database] B+Tree 자료구조
[Database] B+Tree 자료구조
2024.03.30데이터베이스에서 특정 값을 검색할 때 해당 컬럼에 인덱스가 없는 경우 전체 테이블을 처음부터 끝까지 탐색하는 Full Table Scan을 수행한다. 테이블에 데이터가 많이 저장되어있고 해당 컬럼에 인덱스가 없으면 쿼리 실행 속도가 매우 느리다. 물론 DBMS가 내부적으로테이블을 쪼개서 멀티쓰레딩 및 병렬처리를 수행하겠지만.. 전체 테이블을 탐색하는 작업은 오버헤드가 크다. 효과적인 탐색을 위해 컬럼마다 인덱스를 구축하고 사용한다. 인덱스 구축에 사용되는 내부 자료구조는 B+Tree / 해시 인덱스 / GIN / R-Tree 등 다양한 등 다양하다. 그 중 범용적으로 사용되는 B+Tree에 대해 살펴보자. B-Tree 데이터의 삽입, 삭제, 검색을 효율적으로 수행할 수 있게 설계된 이진 트리의 일종으로 ..
[Database] 내부 저장 구조
[Database] 내부 저장 구조
2024.01.29관계형 데이터베이스에서 테이블을 정의하고 데이터를 저장할 때, 일부 데이터베이스에서는 테이블의 PK와는 별개로 내부적으로 rowid라는 개념을 사용해서 데이터를 저장한다. 사용자가 테이블을 정의할 때 row_id 라는 컬럼을 지정하지 않았지만 데이터베이스가 내부적으로 row_id를 컬럼을 만들고 각 row을 식별할 때 사용한다. 이 rowid는 row의 물리적인 위치를 가리키고, 위치 기반 접근으로 디스크에서 데이터를 더 빠르게 찾고 조작할 수 있다. rowid 개념을 사용하는 데이터베이스는 아래와 같다. SQLite 모든 테이블은 기본적으로 rowid라는 숨겨진 컬럼을 가지고, 이 rowid로 각 행을 식별한다. rowid 기반 쿼리는 매우 빠르게 동작해 대규모 데이터셋에서 유리하다. PostgreSQ..
[Database] ACID
[Database] ACID
2024.01.21트랜잭션은 데이터베이스 작업의 단위로, 여러 쿼리의 집합으로 생각하면 편하다. 가장 쉽게 설명하는 예시로는 계좌이체가 있는데.. 계좌이체 예시와 트랜잭션을 안전하게 처리하는 주요 특성인 ACID에 대해 살펴보자. RDB는 ACID 속성을 엄격하게 준수하고, 락 기반으로 동시성을 제어하지만 NoSQL 기반 데이터베이스는 종류에 따라 ACID 속성을 사용하지 않고 확장성과 성능을 향상시키는 경우도 있다. Atomicity 트랜잭션 안에 있는 모든 쿼리는 모두 성공하거나 실패해야한다는 속성이다. 계좌이체는 출금과 입금으로 이루어지는데.. 출금 쿼리만 성공하고 DB서버가 죽어버리면 DB서버가 다시 시작할 때 트랜잭션을 롤백한다. (clean up) 낙관적 트랜잭션 처리를 사용하는 데이터베이스에서는 트랜잭션이 실..
[MySQL] 인덱스
[MySQL] 인덱스
2023.08.30컴퓨터에서 CPU나 메모리같은 주요 장치는 전자식이지만, 데이터를 저장하는 HDD는 기계식이다. 이런 HDD를 대체하기 위해 전자식 저장 도구인 SSD가 등장했다. SSD는 전자식으로 데이터에 접근해 훨신 빠르고, 플래시 메모리를 장착하고 있어 전원이 공급되지 않아도 데이터가 삭제되지 않는다. MySQL에서 인덱스는 테이블에서 칼럼의 값과 해당 레코드가 저장된 주소를 키 - 값으로 저장하는 자료구조이다. 인덱스는 정렬된 상태로 보관되기에 특정 레코드에 접근할 때 인덱스를 사용하면 빠르게 접근할 수 있다. 데이터베이스 테이블에 대한 참조로 생각하면 된다. B-Tree 인덱스 B-Tree는 데이터베이스의 인덱싱 알고리즘 중 가장 일반적으로 사용되고 가장 먼저 도입된 알고리즘이다. (Balanced Tree)..
[MySQL] 트랜잭션과 락
[MySQL] 트랜잭션과 락
2023.08.28데이터베이스에서 트랜잭션은 하나 이상의 SQL 그룹으로, 그룹 단위로 실행이 성공하거나 실패함을 보장한다. 트랜잭션의 주요 속성으로는 ACID가 있다. Atomicity : 트랜잭션 단위 작업은 모두 완료되거나 모두 실패한다. Consistency : 데이터베이스를 일관성 있는 상태로만 다뤄야 한다. (계좌이체에서 인출됐지만 입금되지 않은 상태가 없어야 함) Isolation : 동시에 실행되는 트랜잭션들끼리는 서로 영향을 주지 않는다 Durability : 트랜잭션이 커밋된 후 해당 내용은 영구적으로 보존되어야 한다. 트랜잭션이 길어질수록 리소스를 많이 사용하게 되니 최소한의 코드에 트랜잭션을 적용하자. 특히 네트워크 작업이 있는 경우 반드시 트랜잭션에서 배제하자. 락 (Lock) 은 데이터베이스에서 ..
[MySQL] 아키텍처
[MySQL] 아키텍처
2023.08.25MySQL 서버는 MySQL 엔진과 스토리지 엔진으로 구분된다. MySQL 엔진 : 클라이언트와의 연결을 관리하는 커넥션 핸들러와 쿼리 최적화를 수행하는 옵티마이저가 중심을 이룬다. 스토리지 엔진 : 실제 데이터를 저장하고 관리한다. MySQL 엔진에서 데이터를 쓰거나 읽어야 할 경우 스토리지 엔진에 핸들러 요청을 보낸다.(InnoDB, MyISAM...) 스토리지 엔진은 MySQL 서버에 플러그인 형태로 추가돼 각 테이블마다 가장 적합한 스토리지 엔진을 선택해서 사용할 수 있다. InnoDB는 트랜잭션 처리에 강하고, MyISAM은 빠른 읽기 연산에 강하다. 스토리지 엔진들의 특성을 고려해 테이블별로 적합한 스토리지 엔진을 적용할 수 있다. 스토리지 엔진 뿐만 아니라 검색어 파서, 인증 도구 등도 모두..
[Oracle] 관리 문법 정리
[Oracle] 관리 문법 정리
2023.04.05DML Data Manipulation Language의 약자로 데이터 조작 언어로 해석된다. 테이블에 있는 행을 삭제, 수정, 추가할 때 사용된다. insert into tbl (a, b, c) values (1, 2, 3); insert into tbl (a, b) select a, b from tbl2 WHERE c = "asdf" tbl 부분에 테이블, 서브쿼리를 작성하고 데이터를 추가한다. 테이블에 columns를 정의하지 않으면 모든 값을 입력해 줘야 한다. 위의 예시에서 서브쿼리를 사용했는데, c가 asdf인 행을 tb1에 삽입했다. 한 번에 여러 데이터를 삽입할 수 있다. insert ALL into tbl1 (a, b) values (a, b) into tbl2 (a, b) values ..
[Oracle] 중급 문법 정리
[Oracle] 중급 문법 정리
2023.04.03GROUP BY expression select a, b, c from tbl where c > 20 GROUP BY (); GROUP BY 문법을 통해 expression으로 행 그룹을 생성하고 해당 그룹을 하나의 행으로 묶는다. WHERE 조건 뒤에 위치하고, WHERE 절이 실행된 후 실행된다. expression 부분에 b를 넣어주면 b별로 값을 집계한다. 값이 b인 행들을 그룹으로 모아서 결과를 반환하고, 집계 함수와 함께 사용해 그룹들에 대한 통계 값을 얻어올 때 사용한다. 그룹으로 묶는 expression을 여러 개 사용해도 된다. 적절하게 사용해 통계 관련 처리를 편하게 하자. GROUP BY ROLLUP (expression) GROUP BY CUBE (expression) GROUPIN..
[Oracle] 기초 문법 정리
[Oracle] 기초 문법 정리
2023.03.28select distinct column as col from t1.table tbl; select 문법으로 테이블 또는 스키마의 테이블에서 열들을 조회할 수 있다. (schema.table.column 구조를 가진다) distinct, unique 를 함께 사용해 중복된 조회 시 나오는 결과에서 중복된 column을 제거할 수 있고, as 를 사용해 조회하는 열의 별칭을 설정할 수 있다. (예시에서는 테이블에도 별칭을 설정했다) 별칭을 적절히 사용해 쿼리의 가독성을 높이자. select 'literal' as lit, col from table SAMPLE (20); SAMPLE [BLOCK] (sample_percent) [SEED (seed_value)] SAMPLE 문법을 사용해 테이블의 일부 값..