온라인강의

[udemy] 데이터 베이스 엔지니어링 - 데이터베이스 내부 이해

콩콩(๓° ˘ °๓)♡ 2024. 7. 3. 00:31

 

1. 테이블과 인덱스가 디스크에 어떻게 저장되는지

테이블은 행기반 / 열기반에 따라 저장 형태가 달라짐

(행기반일 경우) 각 행별로 저장되며 페이지 단위로 저장됨

-> 읽어올 때 한 행만 읽어오는 것이 아닌, 페이지 단위로 읽어온다

페이지들은 '힙'이라는 자료구조에 저장되는데, 여기에 접근해서 데이터를 읽어오는 것은 큰 비용이 드는 일임

-> 인덱스를 사용하면 비용을 줄일 수 있음

- 인덱스 : 힙을 가리키는 포인터를 모아둔 자료구조

 

2. 행 기반 vs 열 기반 데이터베이스

행 기반 데이터베이스 열 기반 데이터 베이스
읽기/쓰기에 최적화 쓰기가 느림
OLTP ( '운영'계 데이터 처리) OLAP ( '분석'계 데이터 처리)
압축에 유용하지 않음 압축에 좋음
집계에 유용하지 않음 집계에 좋음
다중 컬럼에 유용한 쿼리 다중 컬럼에 비효율적인 쿼리

 

3. 기본 키 vs 보조 키

- 기본키 : 일정 값을 기준으로 순서를 유지하려는 속성, 정렬된 상태를 유지함

ex. mysql의 primary key, oracle의 index organized table, postres의 클러스터링 인덱스

삽입을 할 경우 무작위성으로 인해 힙을 많이 움직이며, 캐싱의 이점을 사용하지 못하게 됨.

- 보조키 : 인덱스를 위한 별도의 외부 구조를 갖고있는 것.

 

 

4. 데이터 베이스 페이지

데이터베이스는 종종 고정 크기의 페이지를 사용하여 데이터를 저장합니다. 테이블, 컬렉션, 행, 열, 인덱스, 시퀀스, 문서 등 모든 것이 결국 한 페이지에 바이트로 저장됩니다. 이렇게 하면 저장 엔진을 데이터 형식 및 API 담당하는 데이터베이스 프론트엔드로부터 분리할 수 있습니다. 또한 모든 것이 페이지인 경우 데이터를 읽고 쓰거나 캐시하는 것이 더 쉬워집니다.

 

데이터베이스는 페이지에서 읽고 씁니다. 테이블에서 행을 읽을 때, 데이터베이스는 행이 속한 페이지를 찾고 해당 페이지가 디스크 상의 어떤 위치에 있는지 식별합니다. 그런 다음, 데이터베이스는 OS에게 해당 오프셋의 파일로부터 페이지의 길이만큼 읽도록 요청합니다. OS는 파일 시스템 캐시를 확인하고 필요한 데이터가 없는 경우, OS는 읽기를 발생시켜 데이터베이스가 사용할 수 있도록 페이지를 메모리에 가져옵니다.

 

데이터베이스는 공유 또는 버퍼 풀이라고도 하는 일정한 크기의 메모리 풀을 할당합니다. 디스크에서 읽은 페이지는 버퍼 풀에 배치됩니다. 페이지가 버퍼 풀에 위치하면, 요청한 행에 액세스할 수 있을 뿐 아니라 행이 얼마나 넓은지에 따라 페이지에 있는 다른 행에도 액세스할 수 있습니다. 특히, 인덱스 범위 스캔으로 인하여 발생하는 읽기를 효율적으로 수행할 수 있습니다. 행이 작을수록 한 페이지에 더 많은 행이 들어가므로, 한 번의 I/O로 더 많은 행을 얻을 수 있습니다.

 

이것은 쓰기에도 동일하게 적용됩니다. 사용자가 행을 업데이트할 때, 데이터베이스는 행이 속한 페이지를 찾고 페이지를 버퍼 풀로 가져와 메모리에서 행을 업데이트한 후 변경 사항(일반적으로 WAL이라고 함)을 저널 항목으로 디스크에 유지합니다. 페이지는 메모리에 그대로 남아 있어 최종적으로 디스크로 플러시되기 전에 더 많은 쓰기를 수신할 수 있으므로 I/O 횟수를 최소화합니다. 삭제와 삽입 작업도 동일하게 작동하지만 구현 방식은 달라질 수 있습니다.