MySQL/MariaDB Full Table Scan
· Version : MySQL, MariaDB
Full Table Scan은 인덱스를 사용하지 않고 테이블 데이터를 처음부터 끝까지 읽어서 요청 작업을 처리하는것을 의미한다. MySQL 및 MariaDB에서는 아래와 같은 조건일때, Full Table Scan을 사용한다.
· 테이블의 레코드 건수가 적어서 인덱스를 통해 읽는것보다 직접 테이블을 읽는것이 더 빠르다고 판된될때 (일반적으로 매우 적은페이지( 1페이지)일때)
· WHERE절이나 ON절에 사용할 수 있는 인덱스가 없을 경우
· 인덱스 레인지스캔을 사용할 수 있는 쿼리라 하더라도 옵티마이저가 판단한 조건 일치 레코드 건수가 너무 많은 경우
테이블 전체를 읽는 작업은 많은 디스크 읽기 오버헤드를 발생시키기 때문에 데이터를 읽을때 한번에 여러개의 블록이나 페이지를 읽어오도록 설계되어 있다. 하지만 MariaDB에서는 풀 테이블 스캔을 실행 할때 한번에 몇개의 페이지를 읽어 올지 설정하는 변수는 없다.
InnoDB나 XtraDB 스토리지 엔진은 특정 테이블의 연속된 데이터 페이지가 읽히면 백그라운드 스레드에 의해 Read Ahead 작업이 자동으로 시작된다. 이 작업은 어떤 영역의 데이터가 앞으로 필요해질 것을 예측하여 요청이 오기전에 미리 읽어 버퍼풀에 두는 것을 의미한다.
풀테이블 스캔이 실행되면 처음 몇개의 페이지는 포그라운드 스레드(Foreground thread, 클라이언트 스레드)가 페링지를 읽기를 실행하지만, 특정 시점부터는 일긱 작업을 백그라운드 스레드로 넘겨 한버네 4개 또는 8개의 페이지를 읽으면서 계속해서 그 페이지를 증가시켜 최대 64개의 페이지까지 읽어 버퍼풀에 저장한다. 포그라운드 스레드는 버퍼풀의 데이터를 가져다 쓰면 되므로 쿼리가 빨리 처리된다. MariaDB의 XtraDB에서는 Read Ahead의 설정은 innodb_read_ahead_threshold 시스템 변수를 이용해 변경할 수 있다. 이 옵션값을 낮추면 자주 Read Ahread가 발생한다. 하지만 빈번한 Read Ahead는 불필요한 I/O 작업을 유발시키므로 주의해야 한다.
2019-09-17 / 강성욱 / http://sungwookkang.com
MySQL, MariaDB, Full Table Scan, 풀 테이블 스캔, Read Ahead, 리드어헤드, 미리읽기,
'MySQL, MariaDB' 카테고리의 다른 글
MySQL/MariaDB Single-pass, Two-pass Sort Algorithm (0) | 2019.09.21 |
---|---|
MySQL/MariaDB Sort Buffer (1) | 2019.09.20 |
MariaDB 히스토그램 (옵티마이저가 실행계획 생성시 참고하는 데이터 분포 정보) (0) | 2019.09.18 |
MySQL /MariaDB 통계 정보 (0) | 2019.09.12 |
MySQL/MariaDB 파일 읽기/쓰기시 발생할 수 있는 secure-file-priv 오류 (0) | 2019.07.24 |