본문 바로가기

개발일지

MySQL 성능 개선 프로젝트 2

 

배송에 관한 이벤트와 장비의 데이터가 들어가있는 두 테이블이 있다.

여기서 각각 활성화 여부, 점검 필요 유무 컬럼은 다른 컬럼과 오늘의 날짜를 비교해 컬럼의 상태가 변해야 한다.

이 과정을 자동으로 처리해주기 위해서 처음에는 Generated Columns를 활용해볼 생각이었다.

delivery_event 테이블을 예로들자면 

`is_active` TINYINT(1) AS (

  CASE

    WHEN `start_date` <= NOW() AND ( `end_date` IS NULL OR `end_date` >= NOW() )

      THEN 1

      ELSE 0

  END

) STORED

와 같이 컬럼을 구성하였다.

하지만 이와 같이 짠다면 에러가 발생한다. 그 이유는 Generated Column에 NOW()와 같은 비결정적함수를 사용할 수 없기 때문이다. NOW()의 값이 매번 바뀌기 때문이다. 따라서 다른 방식인 이벤트를 사용하기로 했다.

시작기간, 종료기간, 마지막 점검일 컬럼 모두  일단위로 입력되어 있고, 실시간으로 반영될 필요는 없기 때문에
매일 자정에 실행되는 이벤트를 생성했다.

CREATE EVENT `update_delivery_event_is_active`
  ON SCHEDULE EVERY 1 DAY 
  STARTS CURDATE()
  DO 
    UPDATE delivery_event SET is_active = 
      CASE 
        WHEN CURDATE() BETWEEN start_date AND end_date 
        THEN 1
        ELSE 0
  END

 

이를 통해 자동으로 활성화 여부와 점검 필요 유무를 갱신할 수 있게 되었다.

'개발일지' 카테고리의 다른 글

MySQL 성능 개선 프로젝트 3  (0) 2024.09.04
MySQL 성능 개선 프로젝트 1  (0) 2024.09.02
20240125  (0) 2024.01.25
20240118  (0) 2024.01.18
20240116  (0) 2024.01.17