Database/MySQL

커버링 인덱스

BUST 2018. 2. 10. 18:28

커버링 인덱스

커버링 인덱스란 인덱스만 이용해서 데이터를 추출할수 있는 인덱스를 의미합니다. 인덱스에서만 데이터를 추출하기 때문에 Disk I/O를 발생시키지 않고 데이터를 쉽게 가지고 올수가 있다.

사용 예

Order By 쿼리

  • (a, b) index가 존재한다면 a에 조건을 걸고, b를 정렬하는 쿼리를 성능을 높일수가 있다.

SELECT a, b FROM tbl  
WHERE a > 1 AND a < 5  
AND b < 'K'  
ORDER BY b;  

데이터 데이터 Range 처리

대용량 데이터를 처리할때 JOIN이 많이 존재하게 되면 실행계획이 이상하게 풀려 제대로 인덱스를 타지 않고 Full-Scan이 될수가 있다. 이때 Driver 테이블의 id만 먼저 추출을 하고 in Query를 이용해서 처리를 할수가 있습니다. id만 추출할때 커버링 인덱스를 이용하여 조건을 줄수가 있습니다.

기존 쿼리

// 하루동안 생성된 Product 정보를 가지고 온다.
SELECT * FROM product p
INNER JOIN product_stock ps
ON p.productId = ps.productId
INNER JOIN product_images pi
ON p.productId = pi.productId
INNER JOIN product_property pp
ON p.productId = pp.productId
WHERE p.createdAt >= '2017-07-31 00:00:00'
AND p.createdAt <= '2017-07-31 23:59:59';
  • 데이터의 양이 많아지면 inner join 테이블 (product_stock, product_images)를 먼저 join을 한후 WHERE 조건을 타게 되서 Full-Scan이 발생될수가 있다.

튜닝한 쿼리

Index를 먼저 출력을 한다.

ALTER INDEX product_idx01
ON product (createdAt)

productId만 가지고 온다.

// id List만 출력을 한다.
SELECT productId FROM product p
WHERE p.createdAt >= '2017-07-31 00:00:00'
AND p.createdAt <= '2017-07-31 23:59:59';

productId List와 In Query를 이용하여 다시한번 쿼리 실행한다.

// id List를 이용하여 정보를 다시 가지고 온다.
SELECT * FROM product p
INNER JOIN product_stock ps
ON p.productId = ps.productId
INNER JOIN product_images pi
ON p.productId = pi.productId
INNER JOIn product_property pp
ON p.productId = pp.productId
WHERE p.productId in (productIdLists.....)

Select Query를 2번이상 사용했지만, 상황 (데이터의 양 등)에 따라 inner join이 3번이 있는 Query 1번보다 2번이상의 Select가 더욱더 빠른 쿼리 성능을 낼수가 있다.

Reference


'Database > MySQL' 카테고리의 다른 글

Group By 쿼리의 활용  (0) 2018.06.09
MySQL 기본 Query 정리  (0) 2018.02.11
Timestamp and Datetime  (0) 2017.07.02
SubQuery 활용  (0) 2017.06.25
DB Isolation Level  (0) 2017.06.11