[DB] 인덱스(Index)란 무엇이며 왜 사용할까?
데이터베이스 조회 성능 향상을 위해 사용하는 인덱스. 인덱스의 원리(B-Tree)부터 쓰기 성능 저하라는 트레이드오프(Trade-off) 관계를 고려하며 어떤 상황에서 사용해야할지 알아봅시다.
원하는 정보를 찾기 위해 책 한 권을 다 읽어야한다면?
인덱스가 없다면 DB는 특정 데이터를 찾기 위해 모든 데이터를 처음부터 끝까지 훑어야합니다. (Full Table Scan)
우리는 조회성능을 위해 인덱스를 사용한다 : 책의 목차 기능
하지만 인덱스를 사용하면 필요한 범위만 빠르게 훑을 수 있습니다. (Index Range Scan)
인덱스란 추가적인 메모리를 사용하여 DB 테이블의 검색 속도 향상을 위해 사용하는 자료 구조입니다. 책의 목차를 보고 원하는 내용이 있는 페이지로 이동하는 것과 같은 원리입니다.
인덱스의 원리 : B-Tree 자료구조
대부분의 관계형 DB는 B-Tree 자료구조를 사용하여 인덱스를 관리합니다. 데이터를 정렬된 상태로 유지하기 때문에 조회성능이 O(log N)의 시간복잡도를 가집니다. 그래서 데이터가 아무리 많아져도 검색 속도가 크게 느려지지 않습니다.
인덱스의 단점 (TradeOff) : 조회 성능의 대가
하지만 인덱스가 항상 좋은 것은 아닙니다. 인덱스는 조회 성능을 얻는 대신 다른 영역에서 비용을 지불합니다.
- 장점 : 빠른 조회(SELECT)
- 단점 : 느린 쓰기(INSERT, UPDATE, DELETE), 추가 공간
데이터가 변할 때마다 인덱스도 함께 갱신되어야 하므로,
쓰기 작업이 잦은 테이블에선 성능 저하가 발생합니다.
인덱스는 원본과 별개의 추가 저장 공간을 사용하며,
여러 칼럼에 생성할수록 저장 공간 부담이 커집니다.
1) 쓰기 성능 저하
인덱스는 테이블에 데이터 추가/수정/삭제될 때마다, 인덱스도 함께 갱신되어야한다는 단점이 있습니다. 결국 쓰기 작업(INSERT, UPDATE, DELETE)이 빈번한 테이블일수록 인덱스로 인해 성능저하가 커질 수 있습니다.
2) 추가 저장공간 사용
인덱스는 원본 테이블과는 별도의 자료구조입니다. 즉, 인덱스를 생성하면 그만큼 추가적인 디스크 공간을 차지하게 됩니다. 책 내용뒤에 목차 페이지가 추가로 필요한 것과 같습니다.
따라서 만약 테이블 크기가 매우 크고 여러 칼럼에 인덱스를 생성한 경우, 저장 공간 부담이 클 수 있습니다.
선택과 집중 : 모든 곳이 아닌, 가장 필요한 곳에 사용
검색 범위가 단번에 좁혀집니다!
인덱스는 다음과 같은 곳에 설정하는 것이 유리합니다.
- 조회가 빈번하게 사용되는 칼럼
WHERE조건 절에서 자주 사용되는 칼럼 (ex.user_id,status)JOIN에서 자주 사용되는 키 (외래키)ORDER BY(정렬) 또는GROUP BY(그룹핑) 대상 칼럼
- 데이터 중복이 낮은 칼럼 (카디널리티가 높은 칼럼)
마치며
인덱스는 강력한 조회성능을 제공하지만, 저장공간과 쓰기성능이 떨어질 수 있음을 감안해야합니다.
무조건적으로 인덱스를 걸기 보다는, 내가 만드는 서비스의 쿼리 패턴과 데이터 특성을 고려하여 인덱스를 걸어야 한다는 점을 기억해주셨으면 좋겠습니다.
댓글남기기