본문 바로가기
트러블 슈팅

STORED 컬럼을 이용한 쿼리 최적화

by Shark_상어 2024. 3. 9.
728x90

해당 글은 회사 업무 중 스케줄 데이터(약 150만개) 들중 다양한 스케줄 제목(스튜디오 특성 상 사용자가 입력 하기 나름)을 가진 데이터 자체를 최적화 했던 방식을 정리 하는 글이다.

1. 데이터 예시

 

위의 사진과 같이 다양한 종류가 존재한다.

2. 최적화 전

1. 촬영 스케줄 이름이 돌 과 같은 데이터를 뽑아 내고자 했을때 쿼리문

schedule_title에 인덱싱이 적용 될수도 없는 LIKE문으로 데이터를 뽑아내야 한다.
이는 돌 데이터만 이렇게 뽑아 낸것이고, 만약 돌, 200일, 100일 등등 여러가지 조건들이 한꺼번에 들어가서 쿼리를

작성해야한다면,  상당한 비용이 발생 될것이다. 다른 방안을 찾아야한다!!!


3. 해결 방안

1. 인덱싱 활용

2. 가상 STORED 컬럼 활용

해결 방안으로는

첫째 인덱싱을 활용한다.
둘쨰 가상 컬럼을 활용한다.

첫번쨰 인덱싱은 LIKE 문에서는 먹지 않는다. 그러면 인덱싱 적용을 위해서는 다른 방안 OR 다른 쿼리를 생각 해야한다.

혹여 다른 쿼리라 한다면, 위 사진 데이터와 같이 사용자가 친숙하게 알아 볼수 있도록 작성된 데이터들 이기에

LIKE 방식 이외에는 떠오르는 방식이 없었다.(실력의 한계)

 

그럼 인덱싱을 적용 시키기 위해서는 가상 컬럼을 활용 해야 한다.

두번쨰 가상 컬럼
어느 방식으로 가상 컬럼을 만들어 낼것 인가??
떠오르는 방식은 이거였다.

위의 사진과 같이 케이스를 조사해서 가상 컬럼을 만들었다.
더 많은 조건들이 많지만, 생략해서 만들었다.
이 쿼리문은 상당한 시간이 걸리지만, 한번 만들고 나면 재 활용이 가능하다.

shooting_kind_cd 이름의 컬럼을 통해서 데이터를 구별해서 저장했고, TINYINT형으로 둔 이유는 크게 INT으로 둬서

메모리를 차지할 필요는 없엇기 때문이다.

인덱싱 추가


위의 사진과 같이 인덱싱을 추가 할수 있다.

인덱싱 추가 된 컬럼을 활용한 where절

 

이를 통해서 LIKE문 과 비교 할 수 없는 정도의 성능을 뽑아 낼 수 있었다.

728x90