인덱스-2022.01.12

Jonguk Kim·2022년 1월 12일
0

데이터베이스

목록 보기
1/1

1. 인덱스(Index)란?

  • 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조

  • 데이터베이스의 index는 책의 색인과 같다.

  • 인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE나 DELETE의 성능이 함께 향상된다.
    => 해당 연산을 수행하려면 해당 대상을 조회해야만 작업을 할 수 있기 때문이다.

  • 만약 index를 사용하지 않은 컬럼을 조회해야 하는 상황이라면 전체를 탐색하는 Full Scan을 수행해야 한다.
    => Full Scan은 전체를 비교하여 탐색하기 때문에 처리 속도가 떨어진다.

2. 인덱스 관리

  • DBMS는 index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
  • 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행된다면 각각 다음과 같은 연산을 추가적으로 해주어야 하며 그에 따른 오버헤드가 발생한다.
    • INSERT: 새로운 데이터에 대한 인덱스를 추가함
    • DELETE: 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
    • UPDATE: 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대해 인덱스를 추가함
  • 인덱스를 사용하는 것 만큼이나 생성된 인덱스를 관리해주는 것도 중요하다. 그렇기 때문에 사용하지 않는 인덱스는 바로 제거를 해주어야 한다.

3. 인덱스 장점과 단점

1) 장점

  • 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
  • 전반적인 시스템의 부하를 줄일 수 있다.

2) 단점

  • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
  • 인덱스를 관리하기 위해 추가 작업이 필요하다.
  • 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
    => CREATE, DELETE, UPDATE 사용이 빈번한 속성에서 사용하면 크기가 커지기 떄문

    UPDATE, DELETE는 기존의 인덱스를 삭제하지 않고 '사용하지 않음' 처리
    => 실제 데이터는 10만건이지만 인덱스는 100만 건이 넘어가게 되어, SQL문 처리 시 비대해진 인덱스에 의해 오히려 성능이 떨어지게 될 것이다.

4. 인덱스를 사용하면 좋은 경우

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

5. 인덱스의 자료구조

1) 해시 테이블(Hash Table)

  • (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠른 데이터 검색이 필요할 때 유용하다.
  • 해시 테이블은 Key값을 이용해 고유한 index를 생성하여 그 index에 저장된 값을 꺼내오는 구조이다.
  • 해시 테이블 기반의 DB 인덱스는 (데이터=컬럼의 값, 데이터의 위치)를 (Key, Value)로 사용하여 컬럼의 값으로 생성된 해시를 통해 인덱스를 구현하였다.
  • 해시 테이블의 시간복잡도는 O(1)이며 매우 빠른 검색을 지원한다.
  • 하지만 DB 인덱스에서 해시 테이블이 사용되는 경우는 제한적인데, 그러한 이유는 해시가 등호(=) 연산에만 특화되었기 때문이다.
    => 해시 함수는 값이 1이라도 달라지면 완전히 다른 해시 값을 생성하므로 부등호 연산(>, <)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블이 적합하지 않다. ==> B+Tree 사용

2) B+Tree

  • DB의 인덱스를 위해 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조이다.
  • 리프노드(데이터노드)만 인덱스와 함께 데이터(Value)를 가지고 있고, 나머지 노드(인덱스노드)들은 데이터를 위한 인덱스(Key)만을 갖는다.
  • 리프노드들은 LinkedList로 연결되어 있다.
  • 데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 된다.
  • 데이터베이스의 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생될 수 있다.
    => BTree의 리프노드들을 LinkedList로 연결하여 순차검색을 용이하게 하는 등 BTree를 인덱스에 맞게 최적화하였다.
  • B+Tree는 O(𝑙𝑜𝑔2𝑛) 의 시간복잡도를 갖지만 해시테이블보다 인덱싱에 더욱 적합한 자료구조가 되었다.
  • InnoDB에서의 B+Tree는 일반적인 구조보다 더욱 복잡하게 구현이 되었다.
    InnoDB에서는 같은 레벨의 노드들끼리는 Linked List가 아닌 Double Linked List로 연결되었으며, 자식 노드들은 Single Linked List로 연결되어 있다.

무언가를 찾기위해 사용


=> 인덱스를 알면 해결가능


왼쪽 인덱스
오른쪽 데이터

누군가 한명 추가됫다면
밑에잇는애들 자리 비워주고 번호 매겨주고 하나씩 밀어줘야함

범위 검색은 좋으나 삽입시 안좋음


약한 참조로 되잇어서 순서 필요없음
해쉬 방식으로 빨리 찾음

  • 클러스터

  • 인덱스


s로시작하는 이메일 있을떄 a로 시작하는 이메일 들어오면 성능이슈 발생


사용자는 pk 모르고 검색


로그인하는데 2초걸리면 사용안함

=> 인덱스 작업

profile
Just Do It

0개의 댓글