개요
이번에는 최신순으로 상품들을 조회하는 SQL 튜닝합니다.
SQL에서 사용한 테이블은 item, brand 두 개로 item 테이블에는 10_000개의 데이터가 brand 테이블에는 10개의 데이터가 있습니다.
기존 SQL
<!-- 상품들 조회 최신순 -->
<select id="getItemsByLatest" resultType="ItemListDto">
select i.item_seq, b.brand_name, i.item_name, i.item_price
from item as i
join brand as b
on i.brand_seq = b.brand_seq
where i.item_seq between #{startOffset} and #{endOffset}
order by item_seq desc
</select>
기존의 itemMapper.xml에서 SQL 입니다.
이 방식은 item 테이블과 brand 테이블을 조인한 이후 startOffset과 endOffset 사이의 값을 가져오고 item_seq를 기준으로 내림차순 정렬을 합니다.
이 방법은 모든 item 테이블에 데이터를 조인 한 후 between의 데이터를 선택합니다. 즉, 조인 할 때 전체 item 테이블과 brand 테이블이 조인되므로 처리해야 할 데이터 양이 많아집니다.
쿼리 튜닝 후 SQL
<!-- 상품들 조회 최신순 -->
<select id="getItemsByLatest" resultType="ItemListDto">
select i.item_seq, b.brand_name, i.item_name, i.item_price
from
(select item_seq, brand_seq, item_name, item_price
from item
where item_seq between #{startOffset} and #{endOffset})
as i
join brand as b
on i.brand_seq = b.brand_seq
order by i.item_seq desc
</select>
쿼리 튜닝 후 SQL 입니다.
서브쿼리를 사용하여 item_seq가 startOffset, endOffset 사이인 행들을 먼저 선택하고, 그 결과를 임시 테이블로 만든 후 brand 테이블과 조회합니다.
이 방식은 item 테이블에서 작은 범위의 데이터를 먼저 필터링하여 임시 테이블의 크기를 줄이고, 그 결과를 brand 테이블과 조인합니다.
즉, 조인을 수행하기 전에 필터링을 수행하여 필요한 데이터 양을 최소화하여 효율적으로 만들었습니다.