인덱스
를 살펴보기 전 해당 인덱스 장에서 자주 언급될 랜덤 I/O
, 순차 I/O
와 같은 디스크 읽기 방식을 먼저 간단히 알아보고 인덱스를 살펴보려한다.
컴퓨터의 CPU나 메모리처럼 전기적 특성을 띤 장치의 성능은 짧은 시간 동안 매우 빠른 속도로 발전했지만 디스크 같은 기계식 장치의 성능은 상당히 제한적으로 발전했다.
비록 최근에는 자기 디스크 원판에 의존하는 HDD
보다 SSD
가 많이 활용되고 있지만, 여전히 데이터 저장 매체
는 컴퓨터에서 가장 느린 부분이라는 사실에는 변함이 없다.
데이터베이스나 쿼리 튜닝에 어느 정도 지식을 갖춘 사용자가 절감하고 있듯이 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O
를 줄이느냐가 관건일 때가 많다.
1. 디스크 읽기 방식
- CPU나 메모리 같은 주요 장치는 대부분 전자식이지만, HDD는 기계식 장치. 그래서 DB 서버에서는 항상 디스크 장치가 병목이 된다
- 이 점을 대체하기 위해 전자식 저장 매체인
SSD
가 많이 출시되고 있다
- SSD도 기존 HDD와 같은 인터페이스(SATA나 SAS)를 지원하므로 내장 디스크나 DAS 또는 SAN에 그대로 사용할 수 있다
- SSD는 기존 HDD에서 데이터 저장용 플래터(원판)를 제거하고, 플래시 메모리를 장착하고 있다
- 디스크 원판을 기계적으로 회전시킬 필요가 없으므로 아주 빨리 데이터를 읽고 쓸 수 있다
- 플래시 메모리는 전원이 공급되지 않아도 데이터가 삭제되지 않는다
메모리
(DRAM)보다는 느리지만 HDD
보다는 훨씬 빠르다
- 디스크 헤더를 움직이지 않고 한 번에 많은 데이터를 읽는 순차 I/O에서는 SSD가 HDD보다 조금 빠르거나 비슷한 성능을 보이기도 한다
- 하지만, 랜덤 I/O에서는 SSD가 HDD 대비 압도적으로 빠르다
- 데이터베이스에서는
순차 I/O
보다 랜덤 I/O
작업 비중이 대부분이므로, SSD의 장점은 DBMS용 스토리지에 최적이라고 할 수 있다
2. 랜덤 I/O와 순차 I/O
- 랜덤 I/O는 HDD의 플래터(원판)를 돌려서 읽어야 할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미함
- 사실 순차 I/O도 이러한 작업 과정은 동일하다
- 그렇다면 랜덤 I/O와 순차 I/O는 어떤 차이가 있는 것일까?
- 3개의 페이지를 순차 I/O, 랜덤 I/O로 기록한다고 가정해보자.
순차 I/O
의 경우 3개의 페이지를 디스크에 기록하기 위해 1번만 시스템 콜
을 요청할 것이고
랜덤 I/O
의 경우 3번 시스템 콜을 요청할 것이다. 즉 디스크 헤드
를 3번 움직여야할 것이다.
- 디스크에 데이터를 읽고 쓰는데 걸리는 시간은 디스크 헤더를 움직여서 읽고 쓸 위치로 옮기는 단계에서 결정된다
- 따라서, 순차 I/O 대비 랜덤 I/O 작업 부하가 훨씬 크다.
- DB 대부분의 작업은 이런 작은 데이터를 빈번히 읽고 쓰기 때문에, MySQL에서는 그룹 커밋, 바이너리 로그 버퍼, InnoDB 로그 버퍼 기능을 내장하고 있다.
- 디스크 원판이 없는 SSD에서도 여전히 랜덤 I/O는 순차 I/O보다 부하가 크다.
- 쿼리를
튜닝
한다는 것은 이러한 부하가 큰 랜덤 I/O
를 줄여주는 것이 목적이라고 할 수 있다.