DB - Data Cleaning

dragonappear·2023년 4월 15일
0

SURLF

목록 보기
5/9


문제점

  • DB에 URL은 3년간 저장된다고 가정하였다.
  • Short Link을 지우지 않으면, 사용되지 않거나 오래된 Short Link이 계속 쌓이게 된다.
  • 문제는 DB에 URL 데이터가 쌓일수록, NoSQL, RDB 상관없이 조회 속도가 느려지고 사용되지 않는 데이터가 공간만 차지하게 된다.
  • DB에 데이터를 지워야 성능적으로 더 개선이 가능하고, 더 많은 ShortId를 사용할 수 있다.
  • 데이터를 지우고 전사탐색하는 것은 분명 DB에 부하를 주는 행위이다.
  • 그러면 어떻게 해야 부하를 최소화하면서 지울수 있을까?

해결

우선 expired 대상인 컬럼을 찾아야 한다.
뒤죽박죽 섞인 컬럼을 created_at이 현재로부터 3년전인 컬럼을 전사 탐색하는 것은 좋은 선택은 아닌것 같다.

일단 created_at 컬럼에 인덱싱을 걸어주면 모든 컬럼에 대해 탐색을 하지는 않는다.
created_at 컬럼에 인덱싱을 걸어주면 되나?
하지만, created_at 인덱싱으로 인해 추가로 차지되는 데이터 공간이 싫다.
그러면 어떻게 해야할까?

어떻게

  • DB에 저장할 때 created_at을 기준으로 오름차순 정렬하면서 데이터를 저장한다.
INSERT INTO short_link (id_short_link,created_at,original_url,short_id,client_ip,user_agent) 
VALUES (1,dummy,dummy,dummy,dummy,dummy)
ORDER BY name created_at;
  • 모든 데이터는 시간순으로 write되므로 write 시간복잡도는 O(1) 이다.

언제

  • expired 된 것을 클라이언트가 요청할 때 지우는 것이 더 나을까? expired 된 것을 계속 찾아서 지우도록 스케쥴링하는 것이 더 나을까?
  • 전자의 경우, 클라이언트가 해당 ShortId로 요청하지 않을 경우, 그 데이터는 지워지지 않을 것이다.
  • 주기적으로 expired 대상에 대해서 지울 필요가 있다.
  • DB는 created_at을 기준으로 오름차순으로 정렬되어있다.
  • 이것을 활용해, 주기적으로 첫번째 데이터(가장 오래된 데이터)를 체크하여, expired 를 체크한다.
    • 첫번째 데이터가 expired 되지 않았으면 나머지 데이터도 똑같이 expired 되지 않았을 것이다.
    • 첫번째 데이터가 expired 되었으면 SELECT 하여 DB에 부하를 줄이면서 가져오기 위해 특정 크기만큼 SELECT 한 뒤, 지우는 Batch 작업으로 데이터를 지운다.

0개의 댓글