레코드를 추가 등록하는 경우 B+Tree의 경우 리프 블록의 이곳저곳이 무작위에 가까운 형태로 업데이트되어 가는데 랜덤 액세스는 느리기 때문에 이 비용을 얼마나 감소시키느냐가 성능에 있어 중요하다.
전통적으로 업데이트된 부분을 순서대로 디스크에 써 나갈 것인데 이런 식이라면 속도가 느린 랜덤 라이트가 많이 발생된다.
MySQL(InnoDB)
업데이트된 정보를 메모리나 전용 파일 등에 일시적으로 기록하여 두고 나중에 모아서 단번에 리프 블록을 갱신하는 구조를 채택
랜덤 라이트보다 훨씬 빠른 시퀀셜 라이트(Sequential Write)로 빠르게 처리한다.
MySQL로 간단한 랜덤 INSERT 벤치 마크 실시 결과, HDD가 병목현상을 일으키고 있는 상태에서 이러한 구현으로 인해 초당 2,000회 정도의 INSERT가 가능했다.
병렬 갱신 성능 높이기
리프 분할 : B+Tree 인덱스에 값의 추가/갱신/삭제를 할 경우, 인덱스의 리프 블록의 내용을 이동시킬 필요가 있다.
여러 클라이언트에서 일제히 업데이트가 발행하여 리프 분할이 여기저기에서 일어난 경우, 그것들의 일관성을 갖는 거이 상당히 어려운 작업인데 InnoDB등에서는 인덱스 재편성 처리가 완료될때까지 일체의 참조/갱신 처리를 차단하는 동작을 시행한다.
병령 갱신 성능의 중요도가 높아지면서 B+Tree 인덱스에는 락 프리(Lock Free)로 갱신 가능하게 하는 알고리즘도 제안되고 있어 차세대 데이터베이스에서는 이러한 알고리즘을 사용되게 될 것이다.
또한 현재 MySQL(InnoDB) 에서 이것을 해결하는 가장 빠른 방법은 "파티션 테이블" 을 사용하는 것이다. 파티션 테이블이란 사용자에게는 테이블이 한 개로 보이지만 내부적으로 복수로 분할 관리되는 것이다. 인덱스도 복수로 구분하고 있기 때문에 병렬 갱신이 가능하다.
'ⓟrogramming > DataBase' 카테고리의 다른 글
[데이터베이스] RAID - 디스크 이중화로 데이터 손실 방지하기 (0) | 2017.11.03 |
---|---|
[데이터베이스] 분산 데이터베이스 환경 (0) | 2017.11.03 |
[데이터베이스] B+Tree 인덱스 (0) | 2017.11.02 |
[데이터 베이스] 인덱스 구조 (0) | 2017.11.02 |
[데이터베이스 기초] 정규화 (0) | 2017.09.19 |