How to Visualize Bigdata — Part3 Query Tuning을 통한 DB 조회 성능 개선

Judy
3 min readOct 6, 2022

--

문제 상황

Quicksight를 통해 데이터를 시각화 하고 대시보드를 생성한 후 Embedded URL을 통해 Web에 게시 하였다. 이후 사이트에 접속했을 때 초기 렌더링 시간이 대략 1분 정도 걸렸다.

원인

사이트 접속하는 순간 쿼리를 날려 가져온 데이터로 대시보드를 구성하게 되는데, 센서 데이터의 경우 양이 많아 쿼리를 날리고 데이터를 가져오는데 오랜 시간이 걸렸던 것이다. 원인을 분명히 파악하기 위해 MySQL Workbench의 Explain Query 기능을 사용했다. Explain Query를 통해 쿼리를 시각화한 결과 쿼리의 비용이 높은 것이 확인됐다.

해결

  1. JOIN 컬럼에 인덱스 생성 :

JOIN 칼럼에 인덱스가 없어 BNL(Block Nested-Loop)가 실행되었고, 이때 type은 ALL(Table Full Scan)이었다. 풀스캔을 돌게 되며 쿼리 비용이 매우 높게 나왔다. JOIN 칼럼에 인덱스를 걸어주었고, 이후 PRIMARY 키에 걸리며 비용이 2배 줄어들었다.

2. 불필요한 JOIN 제거 :

기존의 쿼리에서는 메타데이터를 가져오기 위해 3개의 테이블을 조인하였다. 여러 개의 테이블을 조인하며 당연히 쿼리 비용이 높아졌다. 이에 모니터링에 상대적으로 덜 중요한 메타 데이터를 가져오는 테이블 조인을 제거하고, 조인 순서도 변경해주었다.

3. Full Scan을 Range Scan으로 변경 :

해당 데이터를 사용하는 시각화 그래프 특성상 최근 하루치에 해당하는 데이터만 필요했으므로, WHERE 절에 아래와 같은 조건을 넣어주어 Full Table Scan에서 Index Range scan을 돌도록 변경해주었다. 쿼리 비용이 약 5배 개선되었다.

WHERE timestamp > SUBDATE(CURRENT_TIMESTAMP(), 1)

결과

쿼리 튜닝을 통해 점차적으로 쿼리를 개선하여 최종적으로 사이트 접속시 렌더링 시간을 1분 정도에서 약 1초로 줄였다.

How to Visualize Bigdata 시리즈 내 다른 파트 보러가기

👉 Part 1. 데이터 파악하기- by Somi Kim

👉 Part 2. AWS QuickSight로 데이터 시각화하기 — by Judy

👉 Part 3. 쿼리 성능 튜닝 — by Judy

👉 Part 4. 차트 레포팅과 차트 데이터 시각화 — by Somi Kim

👉 Part 5. FastAPI를 사용한 차트 별 API 생성 — by 장수아

작성자

장수아 — Frontend, UX/UI Design

김소미 — Backend, 데이터 시각화

정수빈 — Backend, 데이터 시각화

--

--