B-tree 인덱스
PostgreSQL 에서 pk 를 설정하면 자동으로 생성되는 가장 기본적인 형태의 인덱스이다. B-tree 구조에서는 하나의 부모 노드에, 자식 노드가 2개 이상 존재할 수 있다.
각 노드안에는 키가 존재하는데, 각 키들은 노드 안에서 정렬되어 있어야 한다. 또 자식 노드의 키 값들은 연결되어 있는 부모 키 값의 크기를 넘길 수 없다. PostgreSQL 에서는 부모 노드부터 키 값을 비교해가며 자식 노드로 내려오는 방식으로 인덱스를 검색한다. 그렇기 때문에 자식 노드 수가 너무 많아지거나 한쪽으로만 노드들이 치우치게 되면 검색 속도가 느려질 수 있다. 이런 경우가 발생하면 인덱스를 다시 한번 정리해주는 과정이 필요하다.
해시 인덱스
해시 인덱스는 B-tree 구조에 해시 함수를 사용하는 인덱스이다. 해시화 함수로 인덱싱할 값을 작은 크기로 변환하고, B-tree 구조로 만들어 사용한다. 그래서 값의 원래 크기와는 상관없이 빠르게 검색할 수 있다. 다만 해시화를 하게 되면 값 비교가 불가능하기 때문에 값의 일치여부를 확인할때 ( 동등 비교 검색 ) 만 사용할 수 있다는 단점이 있다.
GIN ( Generalized Inverted Index )
주로 문자열을 검색할 때 사용하는 인덱스이다. 보통 인덱스는 접두사를 기준으로 데이터를 정렬하게 되지만, array 나 jsonb, 그리고 문자열 전문 검색 등이 필요할 때는 전체 테이블을 스캔하기 힘들다. 예를 들어 문서 전체에서 원하는 키워드를 검색한다고 하자. 문서 내 사용된 모든 단어에 대해 어떤 문서들이 사용되어있는지 단어와 연결되어 있다면 빠르게 검색할 수 있다.
이외에도 컬럼 하나만을 기준으로 인덱스를 만들 것인지 ( 단일 컬럼 인덱스 ), 아니면 컬럼 여러개를 기준으로 인덱스로 만들 것인지 ( 복합 컬럼 인덱스 ) 에 따라서도 나눌 수 있다.
단일 컬럼 인덱스
컬럼 하나를 기준으로 특정 값이나 범위 내 값을 불러올 때, 정렬할 때 사용할 수 있다. 다만 하나의 컬럼에 대한 정보만 담고 있기 때문에 2가지 이상의 컬럼 정보들을 동시에 일치 검색 하는 경우에는 하나씩 모든 데이터를 대조하며 검색해야 하기 때문에 속도가 느려진다.
다중 컬럼 인덱스
인덱스 대상이 여러개의 컬럼인 경우이다. 단일 컬럼에서 할 수 있는 값 검색, 범위 검색이 모두 가능하다. 다만 2번 컬럼은 1번 컬럼에 의존해서 정렬되어 있는 구조이기 때문에 2번 컬럼은 1번 컬럼이 같은 경우에만 인덱스 사용 의미가 있게 된다.
#참조
https://spiderwebcoding.tistory.com/6
https://velog.io/@jsj3282/17.-%ED%95%B4%EC%8B%9CHash-%EC%9D%B8%EB%8D%B1%EC%8A%A4
https://www.cockroachlabs.com/docs/stable/inverted-indexes.html
https://steady-coding.tistory.com/546
모두를 위한 PostgreSQL
'개발 > 데이터베이스' 카테고리의 다른 글
[PostgreSQL] JOIN ( INNER, LEFT, RIGHT, FULL ) (0) | 2022.04.30 |
---|---|
[PostgreSQL] UNION, INTERSECT, EXCEPT (0) | 2022.04.30 |
[PostgreSQL] DISTINCT, HAVING (0) | 2022.04.27 |
[PostgreSQL] 서브쿼리 연산자 (0) | 2022.04.26 |
[PostgreSQL] CASE 함수 / COALSECE 함수 / NULLIF 함수 (0) | 2022.04.11 |