개발/데이터베이스

[MySQL] 인덱스를 사용하는 이유, B-Tree 구조 및 동작 방식

선우. 2024. 7. 18. 22:17

개요

MySQL InnoDB 엔진이 데이터를 디스크에 읽고 쓰는 방식을 알아보고, 인덱스를 적용하면 왜 성능이 개선되는 것인지 살펴보고자 합니다.

 

1. 데이터 읽기/쓰기와 디스크 드라이브

 데이터베이스에서 작성한 데이터는 디스크 드라이브에 저장되어 영속됩니다.

 

컴퓨터에서 CPU나 메모리 등의 주요 장치는 전자식 장치지만, HDD는 기계식 장치입니다. 디스크에 데이터를 쓰고 읽는 데 걸리는 시간은 디스크 헤더를 물리적으로 움직이는 단계에서 결정됩니다. 때문에 데이터베이스 서버에서는 데이터를 읽어올 때 하드 디스크 드라이브가 병목지점이 됩니다.

 

이러한 단점을 개선하기 위해 SSD가 출시되었습니다. 솔리드 스테이트 드라이브는 기존의 HDD에서 플래터(원판)를 제거하고 그 대신 플래시 메모리를 장착하고 있습니다. 덕분에 디스크 원판을 물리적으로 회전시킬 필요가 없어서 데이터를 빠르게 읽고 쓸 수 있습니다. SSD는 HDD 보다 훨씬 빠르지만, 그럼에도 여전히 DRAM(메모리) 보다는 느립니다.

 

따라서 일반적으로 쿼리를 튜닝하는 것은 디스크 I/O를 줄이는 것이 관건입니다.

 

2. 인덱스를 사용하는 이유

 인덱스를 사용하면 테이블 레코드가 저장된 데이터 파일을 모두 살펴볼 필요가 없습니다. 즉, 불필요한 디스크 I/O를 줄일 수 있어 지연시간을 단축할 수 있습니다.

 

MySQL InnoDB 엔진은 기본적으로 B-Tree 인덱스를 추가합니다. B는 Balanced의 약자로 칼럼의 값을 기준으로 항상 정렬된 상태를 유지합니다. 따라서 새로운 데이터가 추가될 때 이전에 추가했던 데이터 다음에 위치하는 것이 아니라, 트리의 루트 노드에서 부터 값을 기준으로 적절한 위치를 찾아 내려가야 합니다.

 

(B-Tree의 구조, 동작 방식 그리고 B-Tree 인덱스 성능에 영향을 미치는 요소에 대한 자세한 설명 추가 예정.)

 

이 때문에 인덱스를 사용하면 쓰기(Write) 작업이 읽기(Read) 작업보다 상대적으로 비용이 많이 든다고 알려져 있습니다. 그러나 대부분의 웹 애플리케이션에서는 읽기 작업이 쓰기 작업보다 훨씬 많기 때문에, 수정/삭제 작업에서 손해를 보더라도 조회 성능에서 이득을 얻는 것은 충분히 고려할 만합니다.

 

3. 인덱스 적용 칼럼의 기준

 인덱스를 적용하면 유용한 칼럼의 기준은 다음과 같습니다.

  1. 조회 조건으로 자주 사용되는 칼럼
    • WHERE 조건에 사용되는 칼럼
    • ORDER BY, GROUP BY의 기준이 되는 칼럼
  2. 카디널리티(Cardinality)가 높은 칼럼

(각 경우에 해당하는 사례 추가 예정)

 

정리

이번 포스팅에서는 디스크 I/O와 인덱스를 사용하는 이유, B-Tree 인덱스 구조와 동작 방식, 인덱스를 적용하면 유용한 칼럼을 살펴보았습니다. 다음 포스팅에서는 MySQL 옵티마이저가 쿼리를 어떻게 처리할 것인지, 실행 계획을 살펴볼 수 있는 EXPLAIN을 다뤄보겠습니다.