728x90

들어가며


데이터베이스 기술의 핵심은 성능 최적화가 아닐까 생각합니다.

앞서 회원정보, 팔로우를 구현하면서 서비스계층에서 읽기와 쓰기를 구분한 이유 역시 이와 같습니다. 결국 데이터는 읽기 위해 저장하는 것이고 읽는 것 또한 저장되어 있어야 가능하기 때문입니다.

2023.12.26 - [DB(MySQL, MongoDB, Redis, Kafka)/MySQL] - MySQL 테스트를 위한 SNS서비스 회원정보 등록

 

MySQL 테스트를 위한 SNS서비스 회원정보 등록

들어가며, 간단한 SNS 모델링을 통해 MySQL의 기능들을 사용해 볼 계획입니다. 아래 기술들을 활용해 Layered 구조로 작성했습니다. Java 17 Spring Boot 3.x MySQL 8.x 회원정보 등록을 구현 회원정보 아이디

wooltech.tistory.com

 

그런 의미에서 잘 저장하는 것과 빠르게 읽어 오는 것이 좋은 성능을 가진 데이터베이스라고 할 수 있습니다.

 

잘 저장하고 빠르게 읽는 다는 것의 의미는?

 

Random과 Sequential의 차이와 같습니다. 순서대로 정리가 되어 있어야 조회와 저장 모두 손쉽게 이룰 수 있습니다. 만약 뒤죽박죽 섞여있다면 데이터를 제자리에 두지 못해 유실될수도 있고 찾지 못할 수도 있습니다. 이것은 데이터 보관의 중요한 속성 중에 하나인 무결성과도 연관이 깊습니다.

 

데이터 무결성이란?

데이터 무결성은 데이터베이스가 운영되는 동안 데이터의 정확성과 일관성을 유지하는 것을 의미합니다.

특히, 데이터가 저장 중에 서버가 다운되거나 하는 등의 이유로 데이터가 손상되지 않아야 합니다.

이를 방지하기 위해 WAL(Write Ahead Log)라는 기술이 등장했습니다.

말 그대로 WAL은 이를 사용하는 시스템에서 모든 수정 사항을 적용되기 전에 로그에 기록하게 됩니다. 그 후  일정량의 작업 후에 프로그램은 WAL에 지정된 모든 변경 사항을 데이터베이스에 기록하고 로그를 지우는 체크포인트를 수행하게 됩니다.

 

10. PostgreSQL의 WAL(Write Ahead Log) (tibero.com)

 

위의 그림은 WAL을 통해 데이터의 무결성을 지키는 동작을 그린 것입니다.

Disk에 수정된 정보가 반영되기 전에 Crash가 발생하였으므로 데이터베이스에는 수정사항이 반영되지 않은 비어있는 TBL 테이블만을 가지고 있습니다. 그러나, 우리는 어디까지 저장하였는지에 대한 정보인 “Checkpoint”와 “A를 반영하고 커밋했다는 로그”, “B를 반영하고 커밋했다는 로그”를 Disk 공간인 WAL Segment에 저장하였습니다. 이를 기반으로
TBL 테이블은 “Checkpoint 까지 반영되어 있으며, 따라서 A로 수정하고 커밋, B로 수정하고 커밋을 수행해야 복구가 완료된다.”
라는 사실을 추론할 수 있습니다. 실제로 WAL을 기반으로한 복구는 해당 과정으로 수행됩니다.

PostgreSQL의 WAL(Write Ahead Log) (tibero.com)

 

데이터 무결성은 지켰지만, 빠르게 저장, 조회하는 방법은?

빠르게 저장하는 방법은 위에서 설명한 WAL과 관련이 있습니다. 아무리 잘 정리를 했다하더라도 데이터의 쓰기 동작은 무작위로 입력받게 됩니다. 따라서 이를 매번 자리를 찾아 저장하게 되면 Random한 동작과 유사하게 동작하게 될 것입니다.

그러므로 메모리에 데이터를 받아 저장 빈도를 줄이는 방식을 이용해 속도를 개선할 수 있습니다. 그리고 메모리 단계에서 데이터가 휘발되는 문제를 해결해주는 것이 WAL입니다.

 

다음은 조회 성능을 향상시키기 위한 자료구조를 알아보겠습니다.

 

1) Hash Map

 

Hash Map은 (키, 값)을 통해 조회를 하기 때문에 단건 검색에서는 매우 빠른 속도를 자랑합니다. 다만, 범위 검색에서는 약점을 가지고 있습니다.

 

2) List

 

List는 정렬된 조건하에 빠른 검색을 할 수 있지만, 정렬이 되지 않았을 때는 정렬에 많은 시간이 소요됩니다.

또한, 삽입과 삭제를 하는 과정에 많은 비용을 들기도 합니다.

 

3) Binery Tree

Binery Tree는 트리 높이에 따라 속도가 정해지기 때문에 높이를 최소화하는 것이 중요합니다. Tree에 종류는 여러가지가 있지만, 검색, 삽입, 삭제와 같은 연산에서 일정한 높이를 유지하며 효율적으로 작동하기 때문에 B+ Tree를 주로 사용하게 됩니다.

+ Recent posts