Optimization
튜닝 시 알면 좋은 것
- 기본적으로 탐색 범위를 최대한 줄이는 방향으로 튜닝하는 것이 좋다.
- 전체 테이블에 비해 소량의 데이터를 조회하는 경우(5% 이하 정도)는 테이블 풀 스캔보다 인덱스 스캔이 효율적이다.
- Update 시 인덱스도 영향을 받는다. 대규모의 Update가 필요할 시에는 인덱스 수정에 의해 오랜 시간이 걸릴 수 있다.
튜닝 대상 기준 (실행계획)
||Good|Bad| |—|—|—| |select_type|Simple, Primary, Derived|dependent, uncacheable| |type|system, const, eq_ref|index, all| |extra|Using index|Using filesort, Using temporary|
- select_type
- SIMPLE : 내부 쿼리가 없는 SELECT
- PRIMARY : 서브쿼리가 포함된 쿼리의 첫 번째 SELECT 쿼리
- SUBQUERY : 독립적으로 수행되는 서브쿼리
- DERIVED : 인라인 뷰
- UNION : UNION에서 첫 번째 SELECT를 제외한 나머지
- UNION RESULT : UNION ALL이 아닌 쿼리로 UNION을 수행했을 경우
- DEPENDENT SUBQUERY : 메인 테이블에 영향을 받는 서브쿼리
- DEPENDENT UNION : 메인 테이블에 영향 받는 UNION
- UNCACHEABLE SUBQUERY : 서브 쿼리 안에 사용자 정의 함수나 변수가 포함되거나 조회시 마다 값이 변경되는 경우
- MATERIALIZED : IN 절의 서브쿼리
- type
- system : 데이터가 없거나 1개만 있는 경우
- const : 데이터가 1건만 조회되는 경우
- eq_ref : 고유 인덱스 혹은 기본 키로 단 1건의 데이터를 조회
- ref : driven table의 접근 범위가 2건 이상인 경우
- ref_or_null : IS NULL 구문에 의한 인덱스 활용, NULL 데이터가 많다면 튜닝 대상이 될 수 있다.
- range : 테이블 내의 연속된 범위 조회, BETWEEN이나 비교 연산 등
- fulltext : 텍스트 검색 전용 전문 인덱스
- index_merge : 두 개 이상의 인덱스가 병합되어 적용
- index : 인덱스 풀 스캔
- all : 테이블 풀 스캔
튜닝 대상이 될 만한 쿼리
- 기본 키를 변형하는 쿼리
- 사용하지 않는 함수를 포함하는 쿼리
- 형변환으로 인덱스를 활용하지 못하는 쿼리 (컬럼과 타입이 일치하지 않는 WHERE 문)
- 열을 결합하여 사용하는 쿼리
- 의미없는 중복제거를 사용하는 쿼리
- 다수 쿼리를 UNION으로만 합치는 쿼리
- 인덱스를 고려하지 않는 쿼리
- 작은 테이블이 먼저 조인에 참여하는 쿼리
- 메인 테이블에 의존하는 쿼리
- 불필요한 JOIN을 사용하는 쿼리