티스토리 뷰
테스트 당한 나의 일
지난 16일 금요일부터 개편될 사이트를 일부 수정하는 작업을 담당하게 되었다.
팀장님: 메인 페이지에 출력할 데이터 테이블을 추가하여 최신글 30개를 화면에 뿌려주세요.
나: ... (쉽네.. JAVA 하다 왔다고 나 무시하나?)
해야할 일은 간단했다. 그저 기존 테이블(NOTICE) 에서 시청자의견(OPINION) 테이블을 추가 후 시간순으로 정렬하여 30개를 가져오면 되는 것 이었다.
JAVA JPA
를 써왔던 나로서 php는 sql mapper
형식이였기에 과정은 어렵지 않았다.
팀장님: 신입이니깐 DB는 손대지 마세요. 조회도 안돼요.
나: ???
실제로 테이블도 안보여주었다.
코딩
"(select id, subject, user_id, wdate FROM {$tbl1} where {$addQue} order by wdate desc limit 15)
UNION All
(select id, subject, user_id, wdate FROM {$tbl2} where {$addQue} order by wdate desc limit 15)
order by wdate desc limit 30";
TIME : 0.019981861114502
최초 쿼리는 이러했다.
각 테이블의 데이터를 정렬 후 15개를 뽑아 UNION ALL
하는것.
그러나 회사일이 그리 쉽지만은 않을것이었다. 라고 생각하여 "혹시 날 시험하는 건가?" 싶어 쿼리를 조금더 들여다보기로 했다.
각 테이블의 컬럼의 규모가 큰 경우 order by
명령어를 3번 사용하는 것은 오히려 독이 아닐까?
그래서 이를 개선하여 조건절을 UNION ALL
후에 해보기로 결정했다.
"(select id, subject, user_id, wdate FROM {$tbl1} where {$addQue})
UNION All
(select id, subject, user_id, wdate FROM {$tbl2} where {$addQue})
order by wdate desc limit 30";
TIME : 0.016567945480347
깔끔하고 속도도 실제로 개선된 것을 볼 수 있었다.
코트를 정리 후 제출하자 곧바로 코드 리뷰가 시작되었다.
팀장님: 개선하려는 도전은 좋았지만 개선을 시키지는 못했네요. 속도를 개선하는 쿼리문에 대해 공부를 해보셨나요?
나: 아뇨...
정답이다.
그저 처리 과정을 단순하게만 하면 쿼리가 개선될꺼라는 생각은 나의 생각이고 SQL는 아니었다.
팀장님: 각 단위 쿼리에 limit를 먼저 주면 속도가 개선되요.
"(select id, subject, user_id, wdate FROM {$tbl1} where {$addQue} order by wdate desc limit 30)
UNION All
(select id, subject, user_id, wdate FROM {$tbl2} where {$addQue} order by wdate desc limit 30)
order by wdate desc limit 30";
TIME : 0.01448392868042
뭔소린가 싶었다...
분명 limit 쿼리
는 모든 쿼리문 안에서 가장 마지막에 실행되는 문구일텐데 쿼리 속도에 영향을 준다는 것은 처음 들었다.
또한 정렬을 3번하는데고 limit 하나로 뒤쳐진 속도를 따라 잡았다는것이 놀라웠다.
정리
1) 대상 테이블이 인덱싱 되어있을것을 고려하자
2) limit를 미리 주면 속도가 개선됨 <- 이유는 아직도 모름
- Total
- Today
- Yesterday
- 자바
- 스프링
- C언어
- kakao
- nginx
- 프로그래머스
- 릿코드
- 알고리즘
- 자격증
- springboot
- 면접
- spring-cloud
- Algorithm
- java
- Solid
- Spring
- ajax
- OOP
- JPA
- 매트랩
- 스프링부트
- security
- 디자인패턴
- 수학
- CS
- interview
- 백준
- 그래프
- docker
- Matlab
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |