개발자 블로그

인덱스 본문

CS/Database

인덱스

hayongwoon 2022. 6. 9. 11:06

 인덱스라는 말은 실생활에서 책 앞단에서 많이 볼 수 있다. 목차라는 영어이다. 책으로 공부를 하면서 원하는 부분을 다시 보고 싶을 때가 있다. 그럴 때 목차를 통해 원하는 부분을 빠르게 볼 수 있다.

 그렇다면, DBMS에서 인덱스는 어떤 기능을 하고 언제 어떻게 사용하면 좋을지 개념 위주로 살펴보자!

 

 책과 DBMS에서 인덱스와의 공통점은 '정렬'이라는 것이다. 알파벳, 글자, 숫자 등 기준이 되는 것에 정렬이 되어 있다는 것이다. 바로 정렬이라는 것이 인덱스의 핵심이고 정렬을 통해 인덱스의 장점과 단점을 파악해볼 수 있다.

 

 그럼 자료구조와 비교해서 설명을 하면 인덱스는 SortedList 자료 구조이고, 데이터 파일은 ArrayList와 빗대어 볼 수 있다. 두 가지 차이는 정렬을 한다. 안한다의 차이이다. 그렇다면 인덱스의 장점을 SortedList 자료구조와 같이 정렬이 되어있기 때문에 원하는 데이터 값을 찾는 것에는 아주 좋은 성능을 보인다. 정렬, 즉 순서가 보장되어 있기 때문에 보다 빠르게 찾을 수 있다. 하지만, 정렬 상태를 유지하기 위해 새로운 데이터가 들어온다고 가정을 하면 다소 효율성이 떨어진다. 예를들어 1번 부터 100번까지 순서대로 앉아있는데, 38번에 해당하는 사람이 자리에 새로 들어가 앉을라면 뒤에있는 번호가 다 일어나서 옆으로 이동해야한다. 때문에 인덱스는 조회를 하는 select where 조건절에서는 탁월한 효율을 보이고 INSERT, DELETE, UPDATE와 같이 데이터를 수정하는 기능에서는 성능이 떨어져 오히려 역효과가 날 수 있다. 이렇듯 장단점이 극명하기 때문에 이를 잘 알고 활용할 필요가 있다. 

 

인덱스 사용 시 주의 사항

1) 사용하지 않는 인덱스는 삭제 -> 불필요한 인덱스는 오히려 INSERT, DELETE, UPDATE 에서 성능 저하 시킬 수 있다. 

 

2) 외래키를 지정한 열에는 자동으로 외래 키 인덱스가 생성이 된다.

 

3) where절에 사용되는 컬럼이라도 '자주' 사용돼야 인덱스의 가치가 있다.

 

4) where절에 '컬럼'에 연산을 사용한 경우 인덱스를 사용하지 않느다. 

    ex) SELECT * FROM user WHERE balance*10 < 100. -------(인덱스 사용 X)

          SELECT * FROM user WHERE balance < 100*10. -------(인덱스 사용 O)

 

데이터를 관리하는 방식(알고리즘)중복값 허용에 따라 여러가지로 나뉜다.

 데이터를 저장하는 방식(알고리즘)별로 구분할 경우 대표적으로 B-Tree와 Hash 인덱스로 구분할 수 있다. 

  •  B-Tree는 이진트리가 아니라 밸런스드 트리로 노드가 2개 이상으로 한쪽에 치우쳐지지 않는 즉 균형잡힌 트리 자료구조라고 생각하면 된다. 역사가 오래된 만큼 성숙하고 가장 많이 쓰이는 방법이다. 그리고 B-Tree인덱스는 컬럼의 값을 변형하지 않고 원래의 값을 이용해서 인덱싱하는 알고리즘이다. 
  • Hash인덱스는 컬럼의 값으로 해시값을 계산해서 인덱싱하는 알고리즘으로 매우 빠른 검색을 지원 하지만 값을 변형시키다 보니 값의 일부만 즉 범위 검색을 할 수 없다. 주로 메모리 기반 (Redis, mongoDB) 등 Nosql에서 자주 사용한다.

데이터의 중복 허용 여부로 분류하면 유니크인덱스와 논유니크인덱스로 나눌 수 있다. 실제 인덱싱하는 값이 1개인지 다수인지에 따라 최적화하는 방향이 크게 달라질 수 있다. 이것을 카디널리티라는 것으로 해석할 수 있는데, 카디널리티는 예를들어 남자와 여자로 인덱스로 나눈다면 다수의 사람들이 2가지로만 묶이니 카디널리티가 낮다고 보고, 고유의 번호인 주민번호는 카디널리티가 높다고 볼 수 있다. 따라서 카디널리티 수준에 따라서 인덱스 사용을 고려해보는 것도 디비 쿼리의 성능을 높이는 조건에 해당한다.

 

클러스터드 인덱스와 논클러스터드 인덱스

Clustered Index (무리를 이룬 index, 군집 인덱스)
Nonclustered Index(무리를 이루지 않은 인덱스, 비군집 인덱스)
-PK

-테이블 당 1개만 존재

-인덱스의 데이터 페이지가 함께 존재

-리프 페이지(데이터) == 데이터 페이지

-데이터가 정렬 된 상태

-루트페이지, 브랜치 페이지, 리프페이지(데이터 페이지) 구조
-Secondary Key(보조키), 보조 인덱스

-테이블에 여러개 존재 가능

-Unique 제약 조건으로 컬럼을 생성하면 자동으로 생성

-인덱스와 데이터 페이지가 따로 존재
   -> 때문에 리프 페이지에서 데이터가 있는 곳의 주소를 가짐
   -> 그래서 데이터 페이지가 정렬되지 않아도 됨

-주소를 갖고 정렬이 되지 않았기 때문에 클러스터드 인덱스보다는 비교적 조회 속도가 느림

-하지만, insert/update/delete는 비교적 성능이 좋음

 

 

REFENCE

1. Real MYSQL 

2. https://www.youtube.com/watch?v=P5SZaTQnVCA 

3. https://www.youtube.com/watch?v=NkZ6r6z2pBg

'CS > Database' 카테고리의 다른 글

[RDB] JOIN  (0) 2022.06.03
DB 기초 - 트랜잭션이란 무엇인가?  (0) 2022.04.22