대용량 데이터 최적화하기

배경

현재 진행중인 프로젝트는 IoT 디바이스 관련 프로젝트로, 모니터링 목적으로 여러 IoT 장비 속 센서에서 측정된 데이터가 1분마다 RDB에 쌓이고 있습니다. 이 상황에서 IoT 디바이스가 많아질수록, 시간이 많이 흐를수록 점점 데이터량은 늘어날 것이고 점점 해당 테이블을 조회하는 부분에 문제가 생길 것이라 판단되었습니다.

생각해본 해결 방안

해당 상황을 해결하기 위한 방법 몇 가지를 생각해보았습니다.

  1. 하드웨어 교체 현재 DB는 IDC 서버를 사용 중 입니다. 이때 SSD를 사용하지 않고 HDD를 사용하고 있어서 DB 성능에 문제가 발생하지 않았나 추측할 수 있었습니다. 하지만 해당 부분은 경제적인 측면에서 선택 불가한 옵션으로 제외했습니다.
  2. DB 교체 대용량 데이터를 처리하기 위해서 많이 사용되는 NoSQL 계열의 DB를 사용하거나 시간 순서대로 쌓이는 데이터를 관리하기 위한 시계열 DB를 사용하면 더 성능이 좋아지지 않을까 생각해보았습니다.
  3. 조회용 테이블 추가 현재 모든 데이터를 하나의 테이블에 넣고 있습니다. 이때 테이블을 두 개로 나눠 첫번쩨 테이블은 모니터링을 하기 위한 목적으로 3개월치의 데이터만 쌓이게 하고 두번째 테이블은 데이터 적재를 하기 위한 목적으로 계속해서 데이터를 누적합니다. 이렇게 테이블을 용도에 맞게 나눠 놓으면 3개월 정도의 데이터는 조회가 용이해지니 나쁘지 않은 방법이라고 생각했습니다.
  4. 쿼리 최적화 인덱스를 추가, 캐시 등의 다양한 방법을 사용하여 조회 쿼리문의 성능을 높이는 방법도 좋다고 생각했습니다.

테스트 및 비교하기

위에서 언급한 2,3,4번 방법을 직접 진행한 후 결과를 비교해보았습니다.

데이터 세팅

기본적으로 동일한 데이터를 가지고 실험하기 위해 더미데이터를 생성 후 해당 데이터를 복사하여 동일하게 사용했습니다. 데이터는 총 500,000개입니다.

id   snum   data1  data2  data3  data4  data5  data6  data7  data8        regdate
1	snum_57	  23	42	   44	  95	 44   	33	   36	  82	2024-01-01 00:00:00
2	snum_1	  62	5	   40	  85	 7  	81	   82	  67	2024-01-01 00:00:01
3	snum_92	  58	14	   96	  37	 0	    89	   46	  62	2024-01-01 00:00:02
4	snum_75	  90	24	   49	  75	 27  	11	   75	  43	2024-01-01 00:00:03
...

이 과정에서 snum은 IoT 디바이스가 가지고 있는 고유의 시리얼넘버를 의미하는 컬럼입니다. 특정 IoT 디바이스의 모니터링을 위해 다음과 같은 쿼리를 작성하고 쿼리 동작 시간을 확인했습니다.

쿼리 동작 시간 세팅법 알아보기

SELECT * FROM test WHERE snum="snum_1";

총 5번의 쿼리문 실행 결과 평균 쿼리 동작 시간 : 0.59388605 초

다른 방법들을 사용 후 쿼리 동작 시간을 비교해보겠습니다.

1. DB 교체

mongodb로 데이터를 이전한 후 mysql to mongodb 데이터 이전하기 같은 쿼리를 동작시켰습니다.

총 5번의 쿼리문 실행 결과 평균 쿼리 동작 시간 : 0.325 초

더 빠른 쿼리 exectution time을 확인할 수 있었습니다.

2. 조회용 테이블 추가

테이블을 나누었다고 생각한 뒤, 20,000개의 데이터만 가진 테이블 조회를 시도했습니다.

SELECT * FROM test WHERE snum="snum_1";

총 5번의 쿼리문 실행 결과 평균 쿼리 동작 시간 : 0.47344567초

데이터 수가 줄어드니 당연하게도 더 빠른 동작 시간을 얻을 수 있었습니다.

3. 쿼리 최적화

results matching ""

    No results matching ""