DB 성능을 향상시키기 위해선 데이터베이스로(랜덤 I/O)의 접근을 줄이고 최대한 메모리에 올라온 데이터로 로직을 수행시켜야 한다.
디스크의 데이터에 접근 할 때 랜덤 I/O 와 순차 I/O로 구분할 수 있다. 대부분 랜덤 I/O가 발생한다. 그런데 성능 향상을 위해 바로 디스크에 접근하게 하지 않고 메모리에 순차적으로 쌓아 일정 양이 차면 한 번에 디스크에 접근 하여 일괄 적용시키는 기술이다. 메모리에 올라가 있는 데이터가 유실될 수 있기 때문에 Write Ahead Log
기술 을 통해 순차적으로 쿼리를 기록한다. 데이터의 무결성을 지킬 수 있다. 무결성
이란 데이터의 정확성, 일관성, 유효성이 유지되는 것을 일컫는다.
인덱스는 정렬된 자료구조, 이를 통해 탐색 범위를 최소화한다.
HashMap
단건 검색 속도 O(1)
범위 탐색은 O(N)
전방 일치 탐색 불가 like 'AB%'
List
정렬되지 않은 리스트 탐색 O(N)
정렬된 리스트 탐색 O(logN)
정렬되지 않은 리스트의 정렬 시간 복잡도 O(N) ~ O(N*logN)
삽입 / 삭제 비용이 매우 높음
Tree
트리 높이에 따라 시간 복잡도가 결정
트리 높이를 최소화 하는 것이 중요
한쪽으로 노드가 치우치지 않도록 균형을 잡아주는 트리 사용
ex) Red-Black Tree, B+Tree
B+Tree
삽입/삭제시 항상 균형을 이룸
하나의 노드가 여러 개의 자식 노드를 가질 수 있음
리프노드에만 데이터 존재 -> 연속적인 데이터 접근 시 유리
https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
위 자료구조 중에서 B+Tree 자료구조를 사용한다. 빠르게 데이터를 조회할 수 있지만 쓰기에는 많은 비용이 들기 때문에 TRADE OFF가 발생한다.