PromleeBlog
sitemap
aboutMe

posting thumbnail
데이터베이스 인덱스(Index)의 원리와 장단점
Database Indexing Principles, Pros, and Cons

📅

🚀

들어가기 전에 🔗

이번 시간에는 수많은 데이터를 빠르고 효율적으로 다루기 위한 필수 기술, 바로 데이터베이스
인덱스(Index)
에 대해 알아보겠습니다.

'인덱스를 사용하면 검색 속도가 빨라진다'는 것은 많은 분들이 알고 계십니다.
하지만 '그렇다면 왜 모든 데이터에 인덱스를 사용하지 않는 걸까?'라는 질문에 대해서는 깊이 생각해 보지 않았을 수 있습니다.
오늘은 이 질문에 대한 답을 찾아가며 인덱스의 정확한 동작 원리와 그 이면의 트레이드오프를 이해해 보겠습니다.

🚀

인덱스(Index)란 무엇인가요? 🔗

인덱스를 가장 쉽게 이해하는 방법은 두꺼운 책의 맨 뒤에 있는 '찾아보기' 페이지를 떠올리는 것입니다.

만약 수백 페이지에 달하는 책에서 'REST API'라는 단어가 어디에 나오는지 찾고 싶다고 상상해 봅시다.
책의 첫 페이지부터 마지막 페이지까지 한 장 한 장 넘겨보는 것은 매우 비효율적입니다.
하지만 '찾아보기' 페이지에 가서 'ㄹ' 섹션에서 'REST API' 항목을 찾으면, '52p, 108p, 210p에 있습니다'라고 바로 알려줍니다.

데이터베이스의 인덱스도 이와 똑같은 역할을 합니다.
특정 데이터를 더 빨리 찾기 위해, 원본 데이터와는 별개로 만들어두는 일종의
목차 또는 찾아보기 페이지
입니다.
인덱스가 없다면, 데이터베이스는 특정 데이터를 찾기 위해 모든 데이터를 하나하나 살펴보는 '풀 테이블 스캔(Full Table Scan)'을 수행해야만 합니다.
Index
Index

🚀

모든 데이터에 인덱스를 걸어야 할까요? 🔗

이것이 인덱스를 이해하는 가장 핵심적인 질문입니다.
결론부터 말하자면,
절대로 그렇지 않습니다.

책의 모든 단어를 '찾아보기' 페이지에 기록한다고 상상해 보세요.
아마 '찾아보기' 페이지의 양이 원본 책보다 훨씬 더 두꺼워지는 말도 안 되는 상황이 발생할 것입니다.
인덱스도 마찬가지로, 장점과 함께 명확한 단점을 가지고 있기 때문에 신중하게 사용해야 하는 기술입니다.

인덱스의 장점 🔗

인덱스의 가장 큰 존재 이유는
SELECT 쿼리의 검색 성능을 극적으로 향상
시키는 데 있습니다.
특히 WHERE 절이나 JOIN 조건에 사용되는 컬럼에 인덱스를 걸면, 풀 테이블 스캔을 피하고 인덱스를 통해 데이터의 위치를 바로 찾아갈 수 있으므로 응답 속도가 매우 빨라집니다.
-- 'user_email' 컬럼에 인덱스가 걸려 있다면, 이 쿼리는 매우 빠르게 실행됩니다.
SELECT * FROM users WHERE user_email = 'student@example.com';

인덱스의 단점 🔗

그렇다면 왜 모든 곳에 인덱스를 사용하지 않을까요?
여기에는 크게 두 가지 이유가 있습니다.
  1. 쓰기 성능 저하 (Write Penalty)
    SELECT를 제외한 INSERT, UPDATE, DELETE 작업의 성능은 오히려 느려집니다.
    책에 새로운 내용을 추가하거나 수정하면, '찾아보기' 페이지도 함께 수정해야 하는 것과 같은 원리입니다.
    데이터베이스에 새로운 데이터를 추가(INSERT)하면, 원본 테이블뿐만 아니라 인덱스 테이블에도 새로운 정보를 정렬하여 기록해야 합니다.
    데이터를 수정(UPDATE)하거나 삭제(DELETE)할 때도 마찬가지입니다.
    따라서, 데이터의 변경이 잦은 컬럼에 인덱스를 무분별하게 추가하면 시스템 전체의 성능이 저하될 수 있습니다.
  2. 추가 저장 공간 필요
    인덱스는 원본 테이블과는 별도의 공간을 차지하는 또 다른 데이터 구조입니다.
    인덱스를 많이 만들수록 그만큼 더 많은 디스크 공간이 필요하게 됩니다.
이처럼 인덱스는 검색 성능과 쓰기 성능 사이의
트레이드오프(Trade-off)
관계에 있습니다.

🚀

그렇다면 인덱스는 언제 사용해야 할까요? 🔗

위의 장단점을 고려하여, 인덱스는 다음과 같은 경우에 사용하는 것이 효과적입니다.

예를 들어, '성별'처럼 '남/여' 두 가지 값만 있는 컬럼보다는, '이메일 주소'처럼 대부분의 값이 다른 컬럼에 인덱스를 거는 것이 훨씬 효율적입니다.
(이것을
카디널리티(Cardinality)가 높다
고 표현합니다.)

🚀

결론 🔗

오늘은 데이터베이스 인덱스의 원리와 그 이면의 트레이드오프에 대해 알아보았습니다.
"인덱스를 사용해 본 경험이 있나요? 어떤 컬럼에 적용했고, 그 이유는 무엇이었나요?" 와 같은 질문은 개발자의 데이터베이스 이해도를 측정하는 좋은 질문입니다.
오늘 배운 내용을 바탕으로, 왜 인덱스를 사용해야 하는지, 그리고 왜 신중해야 하는지를 명확히 설명할 수 있도록 준비해 두시길 바랍니다.

참고 🔗