ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 인덱스
    💻 computer science/📦 database 2022. 10. 5. 18:13

    인덱스 🔖


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

    ex) 책의 마지막 장에 있는 찾아보기

     

    인덱스를 활용하면, 데이터를 조회하는 SELECT 외에도 UPDATE, DELETE 의 성능이 함께 향상된다.

    → 해당 연산을 수행하기 위해서는 해당 대상을 조회해야만 작업을 할 수 있기 때문이다.

    인덱스 관리

    DBMS는 index를 항상 최신의 정렬 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.

    • 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE가 수행되면 각각의 연산을 추가적으로 해주어야 한다.
    • 그에 따른 오버헤드가 발생

    INSERT : 새로운 데이터에 대한 인덱스 추가

    UPDATE : 기존의 인덱스를 사용하지 않음 처리 후 갱신된 데이터에 대해 인덱스를 추가

    DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행

    장점 / 단점

    장점 단점
    테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다. 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 추가로 필요하다.
    전반적인 시스템의 부하를 줄일 수 있다. 인덱스를 관리하기 위한 추가 작업이 필요하다.
      인덱스를 잘못 사용할 경우 오히려 성능 저하가 될 수 있다.
    • INSERT, UPDATE, DELETE가 빈번히 일어나는 속성에 인덱스를 설정하면 인덱스의 크기가 매우 커져 성능이 오히려 저하가 된다.

    사용하면 좋은 경우 ❓

    1. 규모가 작은 테이블
    2. INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
    3. JOIN, WHERE, ORDER BY에 자주 사용되는 컬럼
    4. 데이터의 중복도가 낮은 컬럼
    5. 등등

    자료구조


    해시 테이블 (Hash Table)

    key-value 로 데이터를 저장하는 자료구조

    • 빠른 데이터 검색이 필요할 때 유용하다.

    Key값을 이용해 고유한 Index를 생성하여 그 Index에 저장된 값을 꺼내오는 구조이다.

    하지만, 등호(=)연산에만 특화되어 있어 부등호 연산(< , >)이 자주 사용되는 데이터베이스 검색을 위해서는 해시 테이블은 적합하지 않다.

    B+Tree

    자식 노드가 2개 이상인 B-Tree 를 개선시킨 자료구조

    B-Tree는 모든 노드에 데이터(value)를 저장했던 것과 다른 특성을 가진다.

    특징

    • 리프노드(데이터 노드)만 인덱스와 함께 데이터를 가지고 있다.
    • 다른 노드(인덱스 노드)들은 데이터를 위한 인덱스(key)만을 갖는다.
    • 리프노드들은 LinkedList로 연결되어 있다.
    • 데이터 노드 크기는 인덱스 노드의 크기와 같지 않아도 된다.

    데이터베이스의 인덱스 컬럼은 부등호를 이용한 순차 검색 연산이 자주 발생할 수 있다.

    리프노드들을 LinkedList로 연결하여 순차검색을 용이하게 하였다.

    시간복잡도는 B+Tree가 O(𝑙𝑜𝑔2𝑛)으로 해시테이블보다 느리지만 인덱싱에 더욱 적합한 자료구조이다.

    종류


    Index 에는 Clustered Index, Non-Clustered Index 두 종류가 존재

    Clustered Index

    책으로 비유하자면 찾고자하는 페이지를 알고 있어 해당 페이지를 바로 펼치는 것.

    이미 정렬된 상태라, 검색시 매우 효율적이다.

    ⇒ 하지만, 중간에 값을 삽입하거나 정렬을 하는 비용이 커지면 성능에 치명적이다.

    • 데이터 삽입, 수정, 삭제시 데이터 전체 정렬 (물리적으로 )
    • 삽입되는 순서에 상관없이 index로 생성되어 있는 컬럼을 기준으로 정렬된다.

    Index Pagekey - 데이터 페이지 번호 로 구성하고, 검색하고자하는 데이터의 키 값으로 페이지 번호를 검색하여 데이터를 찾는다.

    Clustered Index는 테이블 당 한개씩만 존재 가능하다.

    ⇒ 테이블에서 Index를 걸었을 때 가장 효율적일 것 같은 컬럼을 Clustered Index로 지정한다.

    Non-Clustered Index

    책으로 비유하자면 목차에서 찾고자하는 내용의 페이지를 찾아 해당 페이지를 펼치는 것

    물리적으로 데이터를 정렬하지 않은 상태

    • 데이터 페이지가 구성된다.
    • 테이들의 데이터는 그대로 두고 지정된 컬럼에 대해 정렬시킨 인덱스를 만든다.

    검색(조회) 속도는 Clustered Index보다 느리지만, 데이터의 삽입 / 수정 / 삭제는 더 빠르다.

    Non-Clustered Index는 테이블 당 여러개 존재 가능하다.

    추가적인 저장공간이 필요하다

    • DB 의 10%

    참고 자료

    http://www.yes24.com/Product/Goods/108887922

    https://mangkyu.tistory.com/96

    '💻 computer science > 📦 database' 카테고리의 다른 글

    MySQL - 스토리지 엔진 수준의 락  (0) 2024.05.11
    📂 MySQL - 트랜잭션 격리 수준  (0) 2024.05.11
    SQL / NoSQL  (1) 2022.10.05
    트랜잭션  (1) 2022.10.05
    정규화  (0) 2022.10.05

    댓글

Designed by Tistory.