1. 기본 인덱스 구조
-
MySQL (InnoDB): 기본적으로 B-Tree 인덱스를 사용합니다. InnoDB는 클러스터형 인덱스를 지원하므로 기본 키(primary key)가 있는 테이블에서 기본 키가 데이터와 함께 저장됩니다. 즉, 데이터 자체가 인덱스의 리프 노드에 저장되는 방식입니다.
-
PostgreSQL: PostgreSQL도 기본적으로 B-Tree 인덱스를 사용합니다. 그러나 PostgreSQL은 클러스터형 인덱스를 기본으로 사용하지 않습니다. PostgreSQL에서 테이블의 데이터를 클러스터링하려면 명시적으로
CLUSTER
명령을 사용해야 합니다. 이 명령은 테이블의 데이터를 지정된 인덱스를 기준으로 정렬합니다.
2. 기타 인덱스 유형
PostgreSQL과 MySQL은 B-Tree 외에도 다양한 인덱스 유형을 지원합니다.
-
MySQL (InnoDB): InnoDB는 B-Tree 외에도 Full-text 인덱스나 Hash 인덱스(메모리 엔진에서)를 지원합니다.
-
PostgreSQL: PostgreSQL은 B-Tree 외에도 Hash 인덱스, GIN(Generalized Inverted Index), GiST(Generalized Search Tree), SP-GiST(Space-partitioned Generalized Search Tree), BRIN(Block Range INdex) 등 다양한 인덱스 유형을 지원합니다. 이러한 인덱스는 각기 다른 용도에 맞게 설계되어 있으며, 예를 들어
GIN
은 전체 텍스트 검색이나 배열 데이터에 유용하고,BRIN
은 큰 데이터베이스에서 범위 검색에 효율적입니다.
3. 클러스터링과 비클러스터링
-
InnoDB (클러스터형 인덱스): InnoDB는 기본적으로 클러스터형 인덱스를 사용합니다. 이 말은 기본 키 인덱스가 데이터 자체를 리프 노드에 저장하고, 데이터는 항상 이 기본 키로 정렬된다는 뜻입니다. 따라서 기본 키가 효율적으로 작동합니다.
-
PostgreSQL (비클러스터형 인덱스): PostgreSQL의 인덱스는 기본적으로 비클러스터형 인덱스입니다. 인덱스는 테이블의 행을 가리키는 포인터만 저장하며, 데이터는 실제로 테이블에 독립적으로 저장됩니다. 필요한 경우
CLUSTER
명령으로 특정 인덱스에 따라 데이터를 물리적으로 재정렬할 수 있지만, 이 작업은 수동으로 수행해야 합니다.
결론
- PostgreSQL과 MySQL(InnoDB) 모두 B-Tree 인덱스를 기본적으로 사용하지만, 두 시스템은 인덱스 관리 방식과 클러스터링 방식에서 차이가 있습니다.
- PostgreSQL은 인덱스 타입이 더 다양하고 유연하게 선택할 수 있다는 장점이 있습니다.