반응형

인덱스가 뭘까?


책에서 목차나 색인과 같다. “제네릭”이라는 키워드를 찾고 싶으면 색인에서 “ㅈ”을 찾고 그 안에서 “제네릭”을 찾는 것과
데이터 베이스의 인덱스도 동일하다. 즉, 데이터의 조회를 빠르게 하기 위해 있는 것이 인덱스이다.

인덱스의 저장 공간


책에서 색인 페이지는 대부분 맨 뒤에 있다. 이 페이지를 공간이라고 본다면 데이터 베이스에도 인덱스 저장 공간이 필요하다.

  • 책의 색인 페이지 == 데이터 베이스 인덱스 저장 공간
  • 책의 색인 == 데이터 베이스의 인덱스
  • 책의 찾고자하는 키워드 == 데이터 베이스의 데이터

데이터가 적을 경우도 인덱스를 사용해야 하나?


아니다. 예를 들어, 5쪽짜리 책이 있다. 이게 색인이 필요한가? 생각 해보면 나는 필요없다고 생각한다.
데이터 베이스도 동일한 구조이다.
인엑스는 대량의 데이터를 빠르게 검색하기 위한 것이다

인덱스가 동작하는 방식


인덱스를 설정한 brand컬럼이 있다고 한다. brand컬럼에 대한 인덱스 공간이 생성이 되었다.

  • where 절에 컬럼 brand에 대해 “스타벅스” 조회를 핸다.
  • 인덱스 공간에서 “스타벅스”를 먼저 찾는다.
  • 찾은 “스타벅스”의 인덱스를 실제 테이블에서 찾아낸다.
  • 조회 된다.

사용되는 알고리즘 : B+Tree


B+Tree는 주로 많이 사용되는 알고리즘이다. B-Tree의 한쪽으로만 몰릴 수 있는 단점을 보완해서
균형을 맞춘 알고리즘이다. 아무래도 한쪽으로만 몰리게 되면 한쪽은 빠른데 한쪽은 느린 현상이 발생하기 때문이다.

장점


  • 검색과 정렬 성능 향상

단점


  • 데이터 베이스의 약 10%의 저장공간이 필요하기 때문에 관리가 필요하다.
  • 오용 시 성능저하가 발생할 수 있다.

성능 저하의 원인

  • INSERT : 새로운 데이터에 대한 인덱스를 추가
  • DELETE : 삭제하는 데이터의 인덱스를 사용하지 않음 처리
  • UPDATE : 기존의 인덱스를 사용하지 않음 처리 → 갱신된 데이터에 대해 인덱스 추가

인덱스에는 위와 같은 특징이 있다.
→ 인덱스를 삭제하지 않고, 추가를 하는 행위만 있다. 결국 용량 자체가 커져서 성능이 저하될 수 있다.
→ DELETE, UPDATE는 특히나 사용하지 않음처리를 하는데 빈번하게 DELETE와 UPDATE를 한다면
사용되지 않는 인덱스가 쌓이게 되기 때문에 성능 저하가 될 수 있다.
→ 데이터의 중복도가 많은 컬럼일 경우

인덱스를 사용해야 하는 상황


  • 규모가 작은 않은 테이블
  • INSERT, UPDATE, DELETE가 빈번하지 않은 컬럼
  • JOIN, ORDER BY, WHERE가 자주 사용되는 컬럼
  • 데이터의 중복도가 낮은 컬럼

데이터의 중복도가 많은 컬럼에서 인덱스가 안좋은 이유


주로 PK가 인덱스인 경우를 많이 보게 된다. PK는 유니크 속성이 주로 있기 때문이다.

만약 1억건의 데이터가 있다고 하자. 이 테이블의 컬럼은 출생년도, 성별, 좋아하는 음식가 있다고 하자.
성별은 남,녀라는 두 경우 뿐이고 대충 5천만건 씩 있을 수 있다. 즉, 중복 데이터가 엄청나게 많다는 것이다.
하지만 충생년도는 아무래도 성별보다는 훨씬 중복 데이터가 적을 것이다.
그럼 둘 중 뭘 기준으로 접근하는 것이 빠르게 찾을 수 있을까?

먼저 예시를 들자.
총 1억건의 데이터가 있다. 그 중
출생년도

  • 30, 50, 60, 70, 80, 90, 00, 10, 20, 21, 22 이렇게 10개의 년도가 있다고 하자.
    1천만 건

성벌

  • 남자, 여자로 각 5천만 건

상황. 파스타를 좋아하는 20년생 남자를 조회한다.
→ 1. 출생년도에서 20년 생을 인덱스에서 찾는다. → 1천만 건에서 남자를 찾는다. → 파스타를 찾는다.

→ 2. 남자인 인덱스를 찾는다. → 5천만 건에서 20년 생인 남자를 찾는다. → 파스타를 찾는다.

당연히 1번이 빠를 것이다. 1천만 건에서 찾는 것과 5천만 건에서 찾는 것은 다르기 때문이다.

반응형

'데이터베이스' 카테고리의 다른 글

데이터 베이스 스키마란?  (0) 2022.01.13
복사했습니다!