MySQL 은 클라이언트의 쿼리를 해석하는 MySQL 엔진과 해석한 쿼리를 실행하기 위한 데이터를 읽고 쓰기 위한 핸들러 역할을 하는 스토리지 엔진으로 구성된다.
InnoDB는 현재 MySQL 기본 스토리지 엔진이고 제일 많이 쓰는 MySQL 스토리지 엔진이다.
InnoDB에서 모든 테이블은 PK에 의해 클러스터링 되어 있다.
→ PK 값의 순서대로 디스크에 저장된다는 의미
그리고 Secondary index 는 레코드의 물리 주소가 아닌 PK 를 가진다.
따라서 InnoDB는 pk에 의한 레인지 스캔은 상당히 빨리 처리될 수 있다.
오라클 DBMS 의 IOT와 동일하게 구성
<aside> 💡
PK 기준으로 클러스터링 되기 때문에 PK에 의한 Range 스캔이 빠르다는 건 실제 데이터가 PK 순으로 연속되어 저장되어 있기 때문
하지만 클러스터링 때문에 쓰기 성능 저하
쓰기 성능 저하의 원인은 pk 기준으로 클러스터링 되어 있어 데이터가 추가되면 저장 되어야 할 데이터 위치를 찾아야함
만약 UUID 같은 pk로 설정되어 있다면 랜덤하게 삽입되어 만약 해당 페이지에 공간이 부족할 경우 페이지 분할이 발생할 수 있어 성능저하가 추가적으로 발생할 수 있음
InnoDB는 PK를 지정하지 않으면 자동으로 PK를 생성 하지만 사용자는 해당 PK를 사용할 수 없음 따라서 InnoDB의 PK를 지정하는 것을 추천
</aside>
하지만 MyISAM 은 PK 와 세컨더리 인덱스랑 차이가 없다.
PK는 유니크 제약 조건을 가진 세컨더리 인덱스이다.
키를 포함한 모든 인덱스는 레코드의 물리 주소를 값으로 가진다.