인덱스를 설명하기 전에 디스크 읽기 방식을 설명하고 디스크 읽기 방식이 어떻게 인덱스가 어떻게 쿼리에 영향을 미치는지 살펴봅니다.
디스크 읽기 방식
컴퓨터는 전기적 장치와 기계적 장치로 구성됩니다. CPU나 메모리같은 전기적 장치의 성능은 빠르게 발전해왔지만 HDD 같은 기계적 장치의 성능은 상당히 제한적으로 발전했습니다. 최근 SSD같은 전기적 장치를 사용하지만 아직 데이터 저장 매체는 컴퓨터에서 가장 느린 부분입니다. 데이터베이스 서버 입장에서 디스크 I/O가 가장 큰 병목을 가져오고 데이터베이스의 성능 튜닝은 어떻게 디스크 I/O를 줄이느냐가 관건입니다.
랜덤 I/O와 순차 I/O
랜덤 I/O는 하드 디스크 드라이브의 플래터(원판)을 돌려서 읽어야할 데이터가 저장된 위치로 디스크 헤더를 이동시킨 다음 데이터를 읽는 것을 의미합니다. 사실 순차 I/O도 같은 과정을 거칩니다. 둘의 차이는 원판의 회전 횟수에 있습니다.
랜덤 I/O는 N개의 페이지를 디스크를 기록하기 위해 N번 디스크의 헤드가 움직입니다. 하지만 순차 I/O는 1번만 움직입니다. I/O 시간에서 디스크를 움직이는 시간이 대부분입니다. 따라서 디스크의 성능은 디스크의 헤더의 위치 이동 없이 얼마나 많은 데이터를 한 번에 기록하느냐에 의해 결정됩니다. 그래서 여러 번 쓰기 또는 읽기를 요청하는 랜덤 I/O는 부하가 큽니다. 대부분의 DB는 작은 데이터를 빈번히 읽고 쓰기 때문에 I/O를 버퍼링하는 기능이 내장돼 있습니다.
사실 쿼리를 튜닝해서 랜덤 I/O를 순차 I/O로 바꿀 방법은 많지 않습니다. 일반적으로 쿼리 튜닝은 랜덤 I/O 자체를 줄이는데 목적을 둡니다. 즉, 필요한 데이터만 읽도록 쿼리를 개선하는 것입니다.
인덱스란?
인덱스란 칼럼의 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 저장해 놓은 것을 의미합니다. 인덱스는 보통 책 맨 뒤에 있는 색인으로 비유합니다. 살펴볼 책의 내용이 있고 그 정보가 있는 페이지 번호가 쌍으로 적혀있습니다. 만약 특정 정보를 찾는다면 색인에서 정보를 찾고 해당 페이지로 이동할 것입니다. 여기서 중요한 점은 색인에서 정보를 찾는 과정입니다. 이 과정이 빠르게 일어나려면 색인은 정렬되어 있어야 합니다. 인덱스 또한 마찬가지입니다. 인덱스는 칼럼의 값을 주어진 순서로 미리 정렬하여 보관합니다.
인덱스는 SortedList로 비유할 수 있습니다. 항상 정렬된 상태를 유지하는 배열입니다. 이를 위해 배열 요소 삽입, 삭제 시 복잡한 로직이 사용됩니다. 즉, DBMS에서 인덱스는 데이터 저장(INSERT, UPDATE, DELETE) 성능을 희생하고 그 대신 데이터 읽기 속도를 높이는 기능입니다. 인덱스 추가 시 데이터의 저장 속도를 어디까지 희생할 수 있는지, 읽기 속도를 얼마나 더 빠르게 만들어야 하느냐에 따라 결정해햐합니다.
'Database' 카테고리의 다른 글
[MySQL] B-Tree 인덱스 - 2 (0) | 2023.05.12 |
---|---|
[MySQL] B-Tree 인덱스 - 1 (0) | 2023.05.04 |
[MySQL] 데이터 암호화 (0) | 2023.03.29 |
[MySQL] 데이터 압축 (0) | 2023.03.24 |
[MySQL] 잠금 (0) | 2023.03.15 |