이번장을 본격적으로 들어가기 전에 Random I/O, 순차 I/O와 같은 디스크 읽기 방식을 간단히 알아보고 시작하겠다.
최근 저장장치로 많이 사용하고 있는 SSD는 기존 HDD에서 플래터를 제거하고 그 대신 플래시 메모리를 장착하고 있다. 그래서 디스크 원판을 기계적으로 회전시킬 필요가 없음. 데이터를 아주 빨리 읽고 쓸 수 있다.
플래시 메모리는 비휘발적이고, D-Ram보다는 느리지만 HDD보다는 빠르다.

위는 RealMySQL에서 제시한 표임. 이 표에 따르면 디램와 디스크 처리속도는 10만배 이상의 차이가 있고, 플래시 메모리와는 1000배 가량의 차이가 있다.
순차 I/O에서는 사실 SSD가 HDD보다 조금 더 빠르거나, 거의 비슷한 성능을 보인다. 하지만 SSD의 장점은 HDD보다 랜덤 I/O가 빠르다는 것이다. 또한 DB작업에서 순차 I/O 작업은 거의 비중이 크지 않음. 대부분 랜덤 I/O를 통해 작은 데이터를 읽고 쓰는 작업이 대부분이다. 따라서 SSD의 장점은 DBMS용 스토리지에 HDD보다 더 최적화 되어있다고 할 수 있다.
무엇이 순차와 랜덤 I/O간 HDD에서 차이를 만들어낼까? 디스크에 기록해야 할 위치를 찾기 위해 순차 I/O는 디스크 헤드를 1번만 움직이면 되지만, 랜덤 I/O는 여러번 디스크 헤드를 옮겨야 한다. HDD에서 가장 큰 속도 병목은 디스크 헤더를 움직이는 것이므로, 랜덤 I/O는 순차에 비해 HDD에서 매우 느려진다.
따라서 디스크의 성능은 디스크 헤더의 위치 이동없이 얼마나 많은 데이터를 한번에 기록하느냐에 의해 결정된다.
그렇다면 SSD는 양자간 차이가 없을까? 실제로는 그렇지 않다. SSD에서도 여전히 랜덤 I/O는 순차보다 전체 처리량이 떨어진다. 그래서 SSD 사양에도 항상 순차와 랜덤의 성능을 비교 구분해서 명시하고 있다.
그렇다면 모든 랜덤 I/O작업 자체를 순차 I/O로 바꾸는게 좋겠지만, 개발자가 쿼리를 튜닝해서 랜덤을 순차로 바꿔 실행할 방법은 거의 없다. 일반적으로 쿼리 튜닝의 목적은 랜덤 I/O자체를 줄이는 것이다. 이 말은, 쿼리를 처리하는데 꼭 필요한 데이터만 읽도록 쿼리를 개선하는 것을 말한다.
💡 인덱스 레인지 스캔은 데이터를 읽기 위해 주로 랜덤 I/O를 이용하며, 풀 테이블 스캔은 순차 I/O를 사용한다. 그래서 큰 테이블의 레코드 대부분을 읽는 작업에서는 오히려 인덱스를 사용하지 않고 풀 테이블 스캔을 사용하도록 유도할 때도 있다. 이런형태는 웹 서비스보다는 데이터 웨어하우스나 통계 작업 등에서 사용된다.