커버링 인덱스
커버링 인덱스란 인덱스만 이용해서 데이터를 추출할수 있는 인덱스를 의미합니다. 인덱스에서만 데이터를 추출하기 때문에 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 |