Open zziri opened 2 years ago
인덱스가 커지면 데이터에 대한 무작위 접근(random access)을 처리하는 비용이 늘어난다?
랜덤 엑세스(I/O)?
논리적, 물리적 순서가 아닌 레코드 하나를 읽기 위해 한 블록씩 접근하는 방식
한 번에 하나의 블록만을 액세스 하는 싱글 블록 I/O 방식이다. (Index range scan)
순차 엑세스(I/O)?
논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽어들이는 방식
테이블 풀 스캔(Table Full Scan)의 경우에는 한 번에 여러 개의 블록을 액세스 하는 멀티 블록 I/O 방식
인덱스 비용 원리
인덱스 키 값의 크기가 random access에 미치는 영향(https://yoon1fe.tistory.com/m/276)
MySQL의 B-Tree에서 자식 노드의 개수는 인덱스의 페이지 크기와 키 값의 크기에 따라 결정된다.
innodb_page_size 시스템 변수를 이용해 4~64KB 사이의 값을 선택할 수 있는데, 기본값은 16KB이다.
인덱스 키가 16바이트이고, 자식 노드 주소가 12바이트라고 가정했을 때, 하나의 인덱스 페이지에는 16*1024/(16+12) = 585개를 저장할 수 있다.
만약 인덱스 키 값이 두 배인 32바이트로 늘어났을 때는 16*1024/(32+12) = 372개 저장할 수 있다.
SELECT 쿼리가 레코드 500개를 읽어와야 한다면 후자의 경우에는 최소 두 번 이상 디스크에서 읽어와야 한다.
또한, 인덱스 키 값의 길이가 길어진다는 것은 전체적인 인덱스의 크기가 커진다는것을 의미하는데, 인덱스를 캐싱하는 InnoDB 버퍼 풀이나 MyISAM의 키 캐시 영역은 크기가 제한적이기 때문에 인덱스의 크기가 커지면 그만큼 메모리에 캐시해 둘 수 있는 레코드 수가 줄어들게 된다.
쓰기 시점에 팬아웃하는 모델
느낌읽기 시점에 팬아웃하는 모델
로 변경해야 할 것으로 보임
[Chapter 12] 채팅 시스템 설계