DB 인덱스(INDEX) 개념 및 설정 시 고려사항

2 분 소요


최근에 DB 인덱스(INDEX)에 대한 질문을 받았습니다. ‘DB 조회 시 속도가 느린 경우 인덱스 걸어주면 속도가 빨라진다.’라고 알고 있다고 대답했습니다. ‘그렇다면 DB 인덱스 설정 시 주의사항에 대해 말씀해주세요.’라는 다음 질문에는 말문이 턱 막혀버렸습니다. 직접 설정해 본 적이 없으니 모를 수 있다고 생각할 수도 있지만, 만능 개발자가 되려면 공부해야 하겠죠?😢 이번 포스트에서 DB INDEX에 대해 정리해보도록 하겠습니다.

DB 인덱스(INDEX) 란?

데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조

책 앞에 있는 목차라고 생각하면 이해하기 쉽습니다. 수천 장이 넘아가는 책 내용에서 원하는 정보만 빠르게 찾을 수 있는 이유도 목차가 있기 때문입니다. 마찬가지로 DB 테이블에 많은 양의 데이터를 모두 확인하면서 원하는 데이터를 찾는 것은 매우 비효율적인 일입니다. 데이터베이스도 목차처럼 데이터와 데이터 위치를 포함하는 자료구조를 통해 데이터 조회를 빠르게 돕습니다. 이 자료구조를 인덱스(Index)라고 합니다.

DB 인덱스 활용시 데이터 검색

이미지 출처, https://mangkyu.tistory.com/96


DB 인덱스 사용 시 장점과 단점

인덱스를 사용하여 속도가 빨라진다면 무조건 사용해야겠네?🤔

그렇지만은 않습니다. 무엇이든 장점이 있으면 단점도 있는 법입니다. DB 인덱스 사용 시 어떤 장단점이 있는지 알아보도록 하겠습니다.

DB 인덱스 장점
  • 테이블에서 검색과 정렬 속도를 향상시킵니다.
  • 질의나 보고서에서 그룹화 작업의 속도를 향상시킵니다.
  • 인덱스를 사용하면 테이블 행의 고유성을 강화시킬 수 있습니다.
DB 인덱스 단점
  • 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요합니다.(약 10%)
  • 인덱스 관리를 위한 추가 작업이 필요합니다.
  • 잘못 사용하는 경우 성능 저하를 일으킬 수 있습니다.
  • 데이터 변경 작업이 자주 일어날 때 인덱스를 재작성해야 할 필요가 있어 성능에 영향을 끼칠 수 있습니다.

DB 인덱스 설정 시 고려사항

인덱스는 하나 혹은 여러 개의 컬럼에 설정할 수 있습니다. DB 인덱스를 설정한다고 무조건 속도가 빨라지지는 않기 때문에 적절한 조건을 가지는 컬럼을 인덱스로 설정할 필요가 있습니다. 어떤 컬럼을 인덱스로 설정하면 좋은지 찾아보았습니다.

기수성(Cardinality)

기수성(Cardinality), 특정 데이터 집합의 유니크(Unique)한 값의 개수
= Cardinality = Distinct Value 개수 = select count(distinct (column)) from table

전체 행에 대한 특정 컬럼의 데이터 중복 수치에 대한 정보를 기수성(Cardinality)라고 합니다. 중복되는 횟수가 높으면 기수성 값이 낮고, 중복되는 횟수가 낮으면 기수성 값이 높다고 표현합니다.

예를 들어 사람을 관리하는 테이블에 ‘성별’이라는 컬럼은 남자와 여자만 존재하기 때문에 중복도가 매우 높습니다. 성별을 인덱스로 설정하는 경우 테이블의 데이터를 반으로 나눠서 탐색하는 것과 다를 바가 없습니다.(생물학적으로 보면 기수성 값은 2) 만약, 데이터의 중복되는 횟수가 낮은 컬럼을 이용하여 데이터를 그룹 지으면 그룹에 편성되는 데이터의 수가 적어지기 때문에 탐색이 빨라지는 효과를 얻게 됩니다.

기수성(Cardinality) 값이 높은 컬럼을 인덱스로 설정하였을 때 성능이 좋습니다.

선택도(Selectivity)

선택도(Selectivity), 데이터 집합에서 특정 값을 얼마나 잘 선택할 수 있는지에 대한 지표
= Selectivity = Cardinality / Total Number Of Records

선택도는 기수성으로부터 계산할 수 있습니다. 선택도가 수식을 보면 알 수 있듯이 기수성 값이 높을수록 선택도 또한 같이 높아집니다. 선택도가 ‘1’ 이라는 의미는 모든 값이 유일(unique)하다는 의미입니다. 높은 선택도를 가지는 컬럼을 인덱스로 설정하는 경우 조회 성능이 향상됩니다.

인덱스가 DML(Data Manipulation Language) 미치는 영향

SELECT 쿼리에서 성능이 잘 나오지만, INSERT, UPDATE, DELETE 쿼리에서는 상황에 따라 다르다고 합니다. UPDATE, DELETE는 WHERE 절에 잘 설정된 인덱스로 조건을 붙여주면 성능은 크게 저하되지 않습니다. UPDATE, DELETE를 하기 위한 데이터를 찾을 때 속도가 빨라지게 됩니다. INSERT의 경우, 새로운 데이터가 추가되면서 기존 인덱스 페이지에 저장되어 있던 탐색 위치가 수정되어야 하므로 효율이 좋지 않습니다.

OPINION

시스템 운영을 하면서 성능 팀으로부터 DB 인덱스 설정에 대한 가이드를 자주 전달받았습니다. 별 생각 없이 가이드에 따라 인덱스를 설정하였는데 공부를 하였으니 조금 더 주의 깊게 살펴볼 필요가 있다고 느꼈습니다.

개발자는 시스템의 속도를 1초라도 단축하기 위해 많은 노력을 합니다. 이번 DB 인덱스에 대한 공부를 하면서 좋은 코드를 작성하는 것만으로는 부족하다는 생각이 들었습니다. 많은 것을 공부하고 배운 것을 실천하는 개발자가 되도록 힘내겠습니다.💪

REFERENCE

카테고리:

업데이트:

댓글남기기