간단하게 두 데이터베이스의 주요 차이점은
- 기본 인덱스와 세컨더리 인덱스를 구현하고,
- 데이터 저장하고(save) 수정(update)하는 방식으로 요약된다.
MySQL
- primary index에서 값은 모든 속성을 포함한 전체 행 객체다. 따라서 primary index를 clustered index라고 부른다.
- primary index에서 key를 조회하면 키가 존재하는 페이지와 해당 키의 값(즉, 전체 행)을 찾을 수 있어서 추가 열을 가져오기 위한 추가 IO작업이 발생하지 않는다
- 세컨더리 인덱스에서는 key가 indexing된 row들이고, 값은 실제 행이 위치한 곳을 가리키는 포인터이다.
- 세컨더리 인덱스의 leaf page의 값은 주로 primary key이다.
- 모든 테이블에 primary index가 있어야 하고, 모든 추가 세컨더리 인덱스는 primary index를 가리킨다.
- primary key를 통해 데이터가 정렬된 채로 저장하는 clusered index구조로 primary index를 생성하기 때문에, pk를 지정하지 않으면 이를 생성하여 값을 저장한다.
Example of where MySQL innoDB all tables must have a clustered primary index
- Thread를 사용해 효율적임
- 경량성, 메모리 공유(스레드는 부모 프로세스의 가상 메모리 주소 공유), 컨텍스트 스위칭(TLB 무효화 하지 않기에 프로세스간 컨텍스트 스위칭 보다 더 빠름)
PostgreSQL
- primary index가 존재하지 않는다.
- 모든 인덱스는 secondary index이며 heap 영역에 로드 된 데이터 페이지에 있는 tuple ID(시스템이 관리)를 가리킨다
- heap에 있는 테이블 데이터는 primary index leaf page와 달리 정렬되어 있지 않다. 따라서 행을 1~100 까지 삽입하고 모든 행이 동일한 페이지에 있을때, 120번 행 업데이트 시 20개의 행이 다른 페이지로 이동해 순서가 바뀔 수 있다.
- 하지만 cluested된 primary index에서는 키의 순서를 만족하는 페이지로 삽입해야한다.
⇒ PostgreSQL 테이블은 index organized table이 아닌 heap organized tables (힙 조직형 테이블)로 자주 불린다.