INDEX를 걸었음에도 조회성능이 나오지 않는 경우가 있을 수 있다.
Query Optimization : 이 단계 에서
MySql 워크벤치를 통해 확인 가능.
SELECT city.name, city.Population
FROM city
inner join country
on city.CountryCode = country.Code
where country.GovernmentForm = 'Republic'
order by city.Population DESC
limit 0, 5;
- 인덱스 범위 스캔(index range scan)은 인덱스를 활용하여 특정 범위내 데이터를 검색
- 주로 WHERE 절의 조건이 범위 연산자 (예: BETWEEN, >, <)를 포함할 때 사용
- 인덱스 전체 스캔(index full scan) 의 경우 인덱스에 저장된 모든 키값을 읽어오는 경우이다.
- 주로 정렬을 사용하거나, Distinct 연산을 수행할때 사용
- 고유 인덱스 스캔(unique scan)은 특정 열에 대한 고유한 값을 검색하는 방법
- 주로 PRIMARY KEY나 UNIQUE 인덱스를 사용하여 고유한 값의 레코드를 찾을 때 사용하며, 해당 값이 존재하는지 여부를 빠르게 확인할 수 있으며, 고유한 값을 가진 레코드를 찾는데 사용
테이블 전체 검색 (Full Tabel scan)은 테이블의 모든 레코드를 처음부터 끝까지 읽어서 조건에 맞는 데이터를 찾는 방법
- 모든 데이터를 스캔하므로 조건에 일치하지 않는 데이터도 읽어야 하기 때문에 더 많은 I/O 비용이 소요
- 단일 행 접근이 매우 빠르기 때문에 ROWID SCAN가 유리하다고 판단되면서 ROWID SCAN을 탈 수 있는 상황이라면 유도해주는 것이 좋음.
explain
SELECT city.name, city.Population
FROM city
inner join country
on city.CountryCode = country.Code
where country.GovernmentForm = 'Republic'
order by city.Population DESC
limit 0, 5;
그 중 봐야할 것은 각 항목에 대한 내용이다. 성능을 개선시킬 수 있게 확인할 요소들이다.
의존의 예시
SELECT
(SELECT c2.some_column FROM table2 AS c2 WHERE
c1.some_column = c2.some_column)
FROM table1 AS c1;
select_type : dependent type은 조회시마다, 외부 테이블에 access하게 되므로 성능에 악역향을 미칩니다. Rand함수들을 활용하면 uncacheable이 나오는데, 이 또한 마찬가지입니다.
인덱스 레인지 풀 스캔, 혹은 테이블 풀 스캔을 줄일 수 있는 방향으로 개선해야 합니다.
filesort나 group by를 위한 temp 테이블 생성보다 인덱스를 활용하여 sorting/group by를 수행할 수 있다면 성능을 개선