안녕하세요.
레거시 데이터 때문에 어쩔 수 없이 UNION을 사용해서 페이징 쿼리를 작성해야 합니다.
원래 쿼리는 너무 길어서 간단하게 적겠습니다.
A Table Query(최대 20_000건)
UNION
B Table Query(최대 20건)
UNION
C Table Query(최대 10건)
ORDER BY updated_at
limit 0, 20 (페이징)
*A, B, C 각 쿼리만 실행했을 땐 빠름
위 쿼리를 실행하면 A 테이블 건 수에 따라 엄청 느려집니다.
실행 계획을 보면 A, B, C 결과를 전부 다 가지고 온 후 ORDER BY 할 때 Using temporary, Using filesort가 발생하는데, 이 때문에 느린 걸로 보입니다.
혹시 이런 경우에 성능 개선할 수 있는 방법이 있을까요?
설명이 부족했다면 말씀 부탁드립니다!
1. UNION 사용이 적절한가?
- 대부분 UNION ALL 이 적합합니다.
- UNION 이 사용되어야 하는 이유가 있는지 검토해 보세요.
-> 넵 UNION ALL이 맞네요. 감사합니다.
2. 복잡하고 긴 쿼리
- 간결하게 줄여야 합니다.
- 넵!
3. A Table Query 만 우선 페이징
- A Table Query 를 20개만 가져다가 사용하세요.
- 2페이지의 경우엔 40개를 가져오고, 3페이지에선 60개 형태로
-> 이거 정말 좋은 방법이네요. 감사합니다!
4. 다른 대안은 없는지?
- 테이블의 특성등을 고려하여 다른 대체 방안 검토
- 예를 들면 합집합을 일배치 등으로 미리 별도 테이블로 만들어 두고 사용한다던가?
-> 넵 이 부분도 고려해보겠습니다!
마농님 너무 감사드립니다. 많이 배워갑니다. 정말 감사합니다!