8.2.1.20 풀 테이블 스캔을 피하는 방법
MySQL이 전체 테이블 스캔 을 사용하여 쿼리를 해결하는 경우 EXPLAIN
의 출력은 type
컬럼에 ALL
로 표시됩니다. 이것은 일반적으로 다음의 조건에서 발생합니다.
테이블이 매우 작기 때문에 키 조회에서 번거 로움보다 테이블 스캔을 실행하는 것이 빠릅니다. 이것은 10 줄 미만의 행과 짧은 줄 길이의 테이블에 많습니다.
인덱스가 설정된 컬럼에 대해
ON
또는WHERE
절에 사용 가능한 제한이 없습니다.인덱싱 된 열 및 상수 값을 비교하고, MySQL이 (인덱스 트리에 따라) 그 상수가 테이블의 매우 큰 부분을 커버하고 테이블 스캔이 빠르게 이뤄질 것으로 계산했습니다. 섹션 8.2.1.2 "MySQL의 WHERE 절 최적화 방법" 을 참조하십시오.
다른 컬럼을 통해, 중요도가 낮은 (많은 행이 키 값과 일치하는) 키를 사용하고 있습니다. 이 경우, MySQL은 키를 사용하여 다수의 키 조회가 실행되고 테이블 스캔이 빠른 것으로 간주합니다.
작은 테이블은 테이블 스캔은 많은 경우에 적절하고 실행의 영향은 무시할 수 있습니다. 큰 테이블에서는 최적화가 테이블 스캔을 잘못 선택하지 않도록 다음 기법을 시도해보십시오.
ANALYZE TABLE
을 사용하여 스캔되는 테이블의 키 분포를 업데이트합니다. 섹션 13.7.2.1 "ANALYZE TABLE 구문" 을 참조하십시오.tbl_name
스캔 된 테이블에
FORCE INDEX
를 사용하여 MySQL에 테이블 스캔은 지정한 인덱스를 사용하는 것과 비교하여 현저하게 부하가 큰 것을 알 수 있습니다.SELECT * FROM t1, t2 FORCE INDEX (
index_for_column
) WHERE t1.col_name
= t2.col_name
;섹션 13.2.9.3 "인덱스 힌트 구문" 을 참조하십시오.
--max-seeks-for-key=1000
옵션을 사용해 mysqld를 시작하거나SET max_seeks_for_key=1000
을 사용하여 최적화에 키 스캔에서는 1,000 더 키시쿠가 발생하지 않으면 상정하도록 에 전달합니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오.