인덱스

JIN·2022년 12월 2일
0

인덱스란? "색인"

코드를 작성할 때 인덱스라고 하면,배열의 위치를 의미한다.



책에서 특정 단어를 찾으려고 하면 처음부터 끝까지 책을 넘기며 찾아야 하는데 이 방법은 너무나 비효율적이고 오래걸리기 때문에 책의 앞페이지에는 목차가 존재한다. 하지만, 목차는 알파벳 순서대로 되어 있는 것이 아니고 책에서 말하고자 하는 개념 순서로 되어 있기에 책의 뒷 부분에 색인 이라는 것이 존재하여 특정 개념이나 단어가 어느 페이지에 위치하는 지를 알려준다.

인덱스 작동원리

데이터베이스에도 이런 색인(INDEX) 작업을 할 수 있다.

인덱스를 사용하면 좋을 것

SQL

SELECT page FROM db_book WHERE title = "transaction";

라고 하면 DB는 FULL SCAN을 하게 된다. (매우 비효율적!)
이 때 인덱스를 생성하면

create index PAGE_INDEX on db_book(page);

B-Tree 구조로 된 인덱스를 생성하면 O(1)의 시간 복잡도로 데이터를 찾을 수 있다.
즉, 인덱스는 특히 where절에서 사용할 column 에 대한 효율화인 것이다.

인덱스를 활용했을 때 효과적인 것

그런데 인덱스를 활용하면 무조건 좋은가? NO
인덱스는 메모리를 차지한다. 인덱스를 생성하기 위해서 데이터베이스에서 추가적으로 10% 정도 차지하므로 불필요한 메모리 낭비가 있을 수 있다. 따라서 조회시 자주 사용하고 고유한 값으로 인덱스를 만드는 것이 좋다.

DML에는 각각 어떤 영향을 미칠까?

  • SELECT: SELECT 쿼리에서 성능이 가장 좋아서 조회시 성능을 가장 극대화 시킬수 있다. 즉 원하는 데이터를 빠르게 찾을 때 빛을 발한다.
  • UPDATE, DELETE : where절에 조건을 잘 걸어주면 성능이 크게 저하되지 않는다.
  • INSERT: 데이터가 추가적으로 들어가기 때문에 기존 인덱스 페이지에 저장 되어 있던 탐색위치가 수정되어야 하므로 비효율적이다.

어떤 컬럼에 인덱스를 설정하는 것이 좋은가?

한 테이블 당 3~5개가 적당하다.

  • 카디널리티 : 컬럼에 사용되는 값의 중복된 정도, 중복 수치를 나타내는 지표
    카디널리티가 높을수록 다양하다는 것이고 데이터의 중복도가 낮다. 따라서 카디널리티가 높을수록 좋다.

  • 선택도 : 데이터에서 특정 값을 얼마나 잘 선택할 수 있는가에 대한 지표이다. 5~10%가 적당하다.
    선택도의 계산 : (칼럼의 특정값의 row 수 / 테이블의 총 row 갯수) * 100
    값이 낮을 수록 좋다 즉, 선택도가 낮을수록 좋다

  • 활용도 : 해당 컬럼이 실제 작업에서 얼마나 많이 활용되고 있는지에 대한 값을 의미하며 활용도가 높을수록 좋다. (조회가 많이 되는 데이터를 인덱스로 가지면 좋다)

  • 중복도 : 중복 인덱스 여부에 대한 값 인덱스도 결국 메모리의 일부이므로 중복된 값을 삭제하는 것이 좋다 즉, 중복도가 없을수록 인덱스에 좋은 칼럼

profile
배우고 적용하고 개선하기

0개의 댓글