InnoDB 에서는 클러스터링 인덱스의 리프노드에 pk와 레코드를 저장한다고 알고 있음
리마큐에서 세컨더리 인덱스로 레인지 스캔을 수행하면 레인지스캔을 수행할때 일치하는 레코드 한건마다 랜덤 I/O가 발생한다는데
세컨더리 인덱스의 리프노드에는 실제 레코드가 저장된 PK가 있으니
레인지 스캔시에 일치하는 갯수 만큼 랜덤 I/O가 발생한다는건 세컨더리 인덱스의 리프노드에서 획득한 PK기반으로 다시 클러스터링 인덱스를 통해서 리프노드의 실제 레코드에 접근한다는 의미임?
세컨더리 인덱스 레인지 스캔으로 PK 하나씩 얻음 -> 각각 클러스터링 인덱스 탐 -> 클러스터링 인덱스 리프노드 레코드 접근 ??
이때 세컨더리 인덱스 레인지스캔 수행시에 PK가 순차적 순서로 얻어진다는 보장이 없으니 디스크 임의 위치 페이지를 랜덤하게 찾아야 해서 랜덤 I/O라고 표현한거 맞지?
ㅇㅇ 맞음 레인지 스캔으로 구해진 각 PK마다 실제 물리적인 위치는 디스크 상에 다 다르잖음? 그만큼 랜덤I/O가 생기는거임 이게 레코드가 너무 많으면 PK클러스터링 레코드로 풀스캔을 할 수도 있음 - dc App
각 레코드 개수만큼 클러스터링 PK인덱스 스캔 vs 그냥 클러스터링 인덱스 풀스캔 뭐가 더 나을지는 옵티마이저가 판단 - dc App
dba 믓찌다 고마워~
궁금한게 있는데 innodb에서 클러스터형 인덱스로 범위 스캔할 때 완벽한 순차 i/o가 발생하는지 아닌지 궁금함 innodb로 테이블 생성하면 클러스터형 인덱스 구조를 가지는데 클러스터형 인덱스는 리프 노드에 실제 레코드의 데이터 페이지를 가지고 클러스터형 인덱스를 기준으로 정렬 되어있는데 이게 논리적으로 정렬된거지 실제 디스크에 페이지가 물리적으로 순차적으로 배치되어 있지는 않지?
삽입 삭제 갱신되면서 완벽한 순차는 깨짐 링크드리스트로 연결 - dc App