본문 바로가기

SQL/모두를 위한 postgreSQL

[PostgreSQL] 7. 데이터 인덱싱_(1)

728x90

데이터 인덱싱
-인덱스는 한국어로 색인 이라는 의미를 가지고 있다
-데이터베이스 인덱스도 데이터 속에서 중요한 부분을 따로 정리하여 쿼리속도 향상시킨다

1. 인덱스의 특징
    
    -쿼리를 수행할 때 인덱스가 없다면 모든 로우를 일일이 조회해야 한다
      인덱스는 쿼리 작업을 매우 효율적으로 만든다

    -하지만 인덱스를 만들면 새로운 로우를 생성하거나 제거하는 작업을 빈번하게 할 때
      속도의 저하가 일어날 수 있다. 매번 인덱스를 업데이트 해야 하기 때문이다

    -단순 인덱스을 만들면 해당 컬럼만 조회할 때 사용할 수 있고,
     다수의 컬럼을 대상으로 조회를 할 때에는 복합 인덱스가 효율적이다

    -복합 인덱스는 순서가 중요하다 특히 먼저 묶는 정보가 더 큰 범위를 포괄하고 있을수록 유용하다

    -'a-b' 복합 인덱스는 a 단순인덱스와 같은 기능을 하기 때문에 대체할 수 있다

 
2. 다양한 인덱스의 종류
    -인덱스는 대상 컬럼 정보와 테이블의 로우 위치 정보를 매핑해서 저장하여 기록한다
    -기본적으로 가장 많이 사용하는 인덱스 자료구조는 B-Tree 구조이다
    
    (1) B-Tree 인덱스
      -하나의 노드가 가질수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조를 말한다
      -가장 기본적인 형태의 인덱스 이다
      -가장 상위의 단계에 있는 노드를 루트노드 라고 하고, 그 밑에 있는 노드가 자식노드 이다
      -각각의 노드가 밑으로 여러 개 연결된 구조가 트리 구조이고, 그 중에서 하나의 노드에 2개 이상의 자식 노드를 갖는다
      -각각의 노드에 있는 키들은 전부 정렬되어 있어야 한다
      -부모노드의 키들 사이사이와 자식노드들이 연결되어 있다.

       이 사이에 연결된 노드가 두 키 값 사이의 값들만 가져야한다
      -예를 들어 루트노드의 9번키의 왼쪽에 연결된 노드의 값들은 모두 9보다 작아야 한다
      -postgreSQL은 루트노드부터 크기를 비교하면서 자식노드를 조회하는 방법을 이용해 검색을 실행한다
      -postgreSQL은 프라이머리 키를 생성하면 자동으로 B-Tree 방식의 인덱스를 생성한다
      -프라이머리 키 값을 이용해서 정보를 찾는 일이 번번하기 때문이다

    (2) 해시 인덱스
      -값을 직접 인덱싱하지 않고 값을 해시화 함수를 통해 

         더 작은 크기의 값으로 변형한 뒤 이 값을 기준으로 B-Tree구조를 만든다
      -해시 인덱스를 이용하면 B-Tree구조만 사용했을 때보다 인덱스 크기면에서 훨씬 작아지게 된다
      -해시화 함수를 거치면서 원래의 값을 변형하기 때문에 인덱스한 컬럼값 사이의 
        크기 비교가 불가능해져 정렬과 비교연산에 이 방식의 인덱스를 활용할 수 없다
      -등호를 이용해서 값이 일치하는지 확인할 때만 해시 인덱스를 사용할 수 있다
      -해시 인덱스는 인덱싱하려는 컬럼값들의 크기가 크고, 

        값이 잘 겹치지 않으면 등호(=)를 이용한 빠른 값을 검색을 해야하는 상황에 적절하다

    (3) GIN
      -전문검색을 주 목적으로 하는 인덱스 이다
      -LIKE 또는 tsvector 관련 연산을 할 때 효율적인 검색이 가능하게 하는 인덱스이다
      -주로 긴 문자열이 들어가는 컬럼에 설정한다


3. 컬럼 수에 따른 인덱스의 종류

    (1) 단일 컬럼 인덱스
      -한 가지 종류의 인덱스 컬럼값을 갖는 방식
      -가장 대표적으로 프라이머리 키 컬럼을 갖는 인덱스가 있다
      -프라이머리 키를 이용하면 해당 컬럼에 어떤값을 검색하거나, 값의 범위에 해당하는 로우를 불러올 때 사용할 수 있다
       또한 해당 컬럼에 대해서 정렬할 때도 도움을 받을 수 있다
      -단일 컬럼 인덱스의 한계점은 두 가지 컬럼의 값을 동시에 일치하도록 검색하는 경우이다
        생성한 인덱스로 한 가지 컬럼의 값을 먼저 찾은 후 다른 컬럼의 값은 하나하나 대조해서 검색해야 한다
      
    (2) 복합 컬럼 인덱스
      -인덱스를 대상으로 하는 값을 여러 개의 컬럼으로 하는 인덱스 이다
      -복합컬럼인덱스는 두 컬럼의 값들을 어떻게 정렬해서 설정할지 정해주어야 한다
      -복합된 두 컬럼 중 어떤 컬럼을 우선으로 정할지가 매우 중요하다
        즉, 정렬을 할 때는 복합컬럼 인덱스의 정렬방향과 선후 관계가 효율성에 있어서 중요하다
      -DBMS는 숫자 이외에 모든 데이터 타입에 대해 대소비교가 가능하다
      -복합컬럼에서 우선순위가 중요하지 않은 상황에서는 더 포괄적인 컬럼에 우선권을 주는 것이 좋다
        다시 말해, 중복이 빈번한 컬럼을 우선적으로 설정하는 것이 좋다

728x90