인덱스란 데이터베이스에서 대한 검색 성능을 향상시키기 위해 사용되는 자료구조입니다.
인덱스를 설명하기 앞서 디스크에서 데이터를 읽어오는 방식에 대해 먼저 알아보려고 합니다.
컴퓨터에서 CPU나 메모리와 같은 전기적 특성을 띤 장치의 성능은 매우 빠르게 발전하였습니다. 반면, 디스크와 같은 기계식 장치의 성능은 상당히 제한적으로 발전하였습니다.
최근 하드 디스크보다 SSD를 많이 활용하지만, 여전히 가장 느린 부품입니다. 그렇기에 데이터베이스의 성능 튜닝은 얼마나 디스크 I/O를 줄이느냐가 관건인 경우가 많습니다.
디스크 읽기 방식에는 순차 I/O, 랜덤 I/O 방식이 존재합니다.
두 방식의 차이점은 데이터 액세스 패턴에 있습니다.
순차 I/O란 데이터를 순차적으로 읽거나 쓰는 방식입니다.
순차적으로 데이터에 접근하여 디스크 헤드의 이동이 최소화되고 성능이 향상되지만, 특정 데이터에 빈번한 액세스가 필요할 경우에는 비효율적인 방식일 수 있습니다.
순차 I/O 방식은 SSD가 하드 디스크 드라이브보다 조금 더 빠르거나 비슷한 성능을 보입니다. 하지만, 랜덤 I/O 에서는 SSD가 훨신 빠른 동작 성능을 보입니다.
랜덤 I/O란 데이터를 임의의 순서로 읽거나 쓰는 방식입니다.
랜덤 I/O 접근 방식을 통해 필요한 데이터를 빠르게 액세스할 수 있는 장점이 존재하지만, 디스크 헤드의 빈번한 이동이 발생하여 성능 저하가 발생할 수 있습니다.
- 테이블의 모든 레코드 스캔을 야기하는 SELECT 쿼리
- 인덱스의 모든 블록을 읽거나 쓰는 경우
- 데이터 정렬 or 그룹화
- 특정 레코드나 데이터 블록을 찾기 위해 인덱스 탐색하는 경우
- WHERE 절의 조건을 포함한 쿼리를 실행하여 레코드를 탐색하는 경우
- 임의의 데이터 위치에 대한 갱신 or 삭제 연산이 수행되는 경우
앞서 언급했듯이 성능 튜닝은 얼마나 디스크 I/O를 줄이느냐가 관건이라고 말씀드렸습니다.
즉, 순차 I/O보다는 랜덤 I/O가 시스템 콜 횟수가 많기에 랜덤I/O를 줄인다는 것이 목적이라고 할 수 있습니다.
랜덤 I/O를 줄인다는 것은 쿼리를 처리하는데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 의미합니다.