본문 바로가기
DB

[DB] 인덱스(1) - 인덱스는 왜 사용하는가?

by soro.k 2023. 3. 13.

인덱스란

데이터베이스에서 인덱스는 성능 개선을 위해 꼭 알아야 하는 필수 개념이다.

Indexes are a powerful tool used in the background of a database to speed up querying. Indexes power queries by providing a method to quickly lookup the requested data.
Simply put, an index is a pointer to data in a table. An index in a database is very similar to an index in the back of a book.
출처 : https://www.codecademy.com/article/sql-indexes

인덱스를 설명하는 글을 보면 항상 책의 목차를 예로 든다. 얇은 책에서는 목차가 굳이 필요 없을 수 있지만 아주 두꺼운 서적을 생각해 보면 목차없이는 내가 원하는 내용을 찾기 어렵다. 이처럼 데이터베이스에서도 많은 데이터들 가운데 원하는 데이터를 빠르게 찾을 수 있게 일부 데이터를 모아서 구성한 데이터 구조를 가지고 있는데 이것을 인덱스라고 칭한다. 

 

 

왜 사용하는가

인덱스를 사용하는 이유는 위에서 간단히 알 수 있지만 성능을 개선하기 위해서이다. 만약 회원 테이블에 100만 건이 넘는 데이터가 저장되어있다고 했을 때, 이름이 '김노력'인 회원을 찾기 위해서는 어떻게 해야 할까? 인덱스가 적용되지 않았을 때는 Full Scan이 일어나면서 첫 번째 행부터 마지막 행까지 원하는 데이터를 찾아야 한다. 인덱스가 적용되었다면 어떻게 다를까? 데이터들이 정렬되어있기 때문에 이전처럼 모든 행을 찾아다니지 않아도 되므로 O(N)이었던 시간 복잡도를 O(logN)으로 개선할 수 있다. 그리고 order by절이나 group by절에서도 성능 개선을 위해 사용할 수 있다.

Index를 쓰는 이유
- 조건을 만족하는 튜플(들)을 빠르게 조회하기 위해
- 빠르게 정렬(order by)하거나 그룹핑(group by) 하기 위해
출처 : https://www.youtube.com/watch?v=IMDH4iAQ6zM

 

 

항상 사용해야 하는가

그렇다면 인덱스를 사용하는 것이 항상 정답이 되느냐? 그것은 아니다. 다음은 이것이 MySQL이다에서 말하는 인덱스의 단점이다.

- 인덱스가 데이터베이스 공간을 차지해서 추가적인 공간이 필요해지는데, 대략 데이터베이스 크기의 10% 정도의 추가 공간이 필요하다.
- 처음 인덱스를 생성하는데 시간이 많이 소요될 수 있다.
- 데이터의 변경 작업이 자주 일어날 경우에 오히려 성능이 나빠질 수 있다.

인덱스를 잘 사용한다면 조회 성능을 많이 개선시킬 수 있지만 잘못 사용할 경우에는 오히려 성능을 저하시킬 수 있다는 것을 항상 명심해야 한다.

 

 

참고로 성능이 좋은 인덱스를 만들기 위해서는 다음과 같은 것들을 고려해야 하고 알아야 한다.

SQL 성능을 최대로 끌어올리기 위해서는 최적의 인덱스가 필요하다. 최적의 인덱스를 만들려면 다음의 능력이 필요하다.
- 인덱스의 물리적인 구조를 이해하는 능력
- 복잡한 SQL을 분해해서 이해할 수 있는 능력
- 만들어진 인덱스가 어떻게 사용될지 예측할 수 있는 능력
- 테이블 내의 데이터 속성을 파악할 수 있는 능력
- JOIN의 내부적인 처리 방법(NESTED LOOPS, MERGE, HASH)의 이해
출처 : SQL BOOSTER

 

 

정리

  • 인덱스란 데이터를 효율적으로 찾을 수 있게 일부 데이터들을 정렬해서 활용하기 자료 구조이다.
  • 인덱스 사용하는 이유는 수많은 데이터 사이에서 원하는 데이터를 빠른 속도로 찾아내기 위함이다. 정렬된 데이터들은 검색 조건에서 정렬을 위해서도 사용할 수 있고 이를 통해 성능을 개선할 수 있다.
  • 하지만 인덱스가 언제나 정답은 아니다. 모든 컬럼에 인덱스를 사용하는 것이 아니라 필요한 컬럼에 인덱스를 적용하여 성능을 개선할 수 있어야 한다.

 

 

참고

  • SQL BOOSTER
  • SQL 레벨업
  • MySQL 성능 최적화