현재 진행중인 프로젝트는 마켓컬리, 쿠팡프레시 등을 벤치마킹한 주문 배송 시스템이다.
그 중 규모가 더 작은 마켓컬리도 하루에 약 10만 건의 주문이 처리된다고 한다.
그렇다면 설계한 배송 주문 테이블에 하루에 10만 건의 데이터가 쌓일것이고, 많은 데이터가 쌓이게 될 것이다.
그래서 데이터를 옮겨주는 아카이빙 기능을 구현하는데, 생각보다 많은 쿼리가 실행되어야 한다.
우선 배송 주문만 옮겨주는게 아니라 해당 데이터의 키값을 외래키로 가지고 있는 모든 테이블들의 데이터를 먼저 처리해 주어야 한다.
그 중 배송 로그만 옮긴다고 했을 때, 옮기는 과정은 다음과 같다.
1.일정기간이 지난 배송 주문 데이터를 아카이빙 테이블에 입력하는 프로시저 실행
2.옮겨진 데이터들의 키값을 외래키로 가지는 배송 로그 삭제
3.배송 주문 데이터 원본 삭제
1. 프로시저
2, 3. 이 과정은 트리거를 이용해 데이터의 무결성을 유지한다.
데이터는 배송 주문과 로그가 약 13만건이 존재했고 약 3초의 시간이 걸렸다.
생각보다 쿼리의 실행속도가 느렸고, 그 이유는 13만건의 데이터 이동에 13만건의 delete 문이 실행돼서라고 생각했다.
그래서 임시 테이블을 생성해 트리거는 해당 임시테이블에 키값만 입력하고 프로시저의 마지막에 delete 문을 실행시키기로 했다.
프로시저의 시작 부분에 임시테이블을 생성 한 후 insert문이 실행되고
트리거에서는 임시테이블에 입력된 데이터들의 키값을 저장한다.
이후 임시테이블을 통해 delete 문을 실행해준다.
그 결과 실행 속도가 0.4초로 확실하게 줄어든 모습을 볼 수 있었다.