풀 테이블 스캔(Full Table Scan) 선택 조건
| 레코드 수가 너무 적을 때 | 인덱스를 거치는 것보다 전체 스캔이 더 빠른 경우 (보통 테이블이 1페이지로 구성된 경우) |
| 적절한 인덱스 조건 없음 | WHERE절이나 ON절에 사용할 수 있는 인덱스가 없는 경우 |
| 일치 레코드가 너무 많을 때 | 인덱스 레인지 스캔이 가능하더라도, 조건에 맞는 레코드가 너무 많다고 판단한 경우 |
리드 어헤드
리드 어헤드(Read Ahead): 앞으로 필요할 데이터를 요청 전에 미리 디스크에서 읽어 버퍼 풀에 적재해두는 InnoDB의 최적화 기법이다.
- 풀 테이블 스캔 시 리드 어헤드 동작 흐름
① 포그라운드 스레드가 처음 몇 개의 페이지를 읽기 시작
↓
② 특정 시점이 되면 백그라운드 스레드로 읽기 작업을 넘김
↓
③ 백그라운드 스레드가 4개 → 8개 → ... → 최대 64개씩 페이지를 미리 읽어 버퍼 풀에 저장
↓
④ 포그라운드 스레드는 버퍼 풀에 준비된 데이터를 가져다 쓰기만 함
↓
⑤ 결과적으로 쿼리가 빠르게 처리됨
- 리드 어헤드 설정
- 시스템 변수 innodb_read_ahead_threshold 로 리드 어헤드 시작 시점(임계값)을 조정할 수 있다.
- 포그라운드 스레드가 이 값만큼 연속된 페이지를 읽으면, 백그라운드 스레드가 이후 페이지들을 대량으로 버퍼 풀에 적재한다.
- 임계값을 2(극단적인 값)로 낮추면 생기는 단점
- 불필요한 I/O 증가: 실제로 필요하지 않은 데이터까지 미리 읽어버려 디스크 I/O 낭비
- 버퍼 풀 오염: 쓸모없는 데이터가 버퍼 풀을 채워 정작 필요한 데이터가 밀려남
- 기본값과 권장값
- 보통 어플리게이션 서버에서는 → 임계값을 기본값(56)으로 유지
- 대용량 풀스캔이 많은 배치 환경 → 8~25 정도로 낮추는 경우가 많음
'Study > MySQL' 카테고리의 다른 글
| 조인 방식 비교 (네스티드 루프 조인 VS 블록 네스티드 루프 조인 VS 해시 조인) (0) | 2026.03.16 |
|---|---|
| B-Tree 인덱스를 통한 데이터 읽기 (0) | 2026.03.02 |
| B-Tree 인덱스 사용에 영향을 미치는 요소 (0) | 2026.03.02 |
| 디스크 읽기 방식 HDD VS SSD (0) | 2026.03.01 |
| MySQL 격리 수준 (0) | 2026.02.17 |