티스토리 뷰
MariaDB 로 운영하는 포탈시스템이 있다.
사이즈가 큰 서버는 아니지만 어쩄든 24/365로 운영되고 있는 시스템인데…
설계/구축부터 혼자 진행했던 시스템이라 구축 당시의 수준이 너무 적나라게 보이는 소스와 쿼리들로 가득하다.
의도한 건 아니였지만 한동안 보지 않았던 건 사실이다.
최근들어 다시 리팩토링이라는 개념에 대해서 공부하며 지난 소스들을 개선하고자 다시 꺼내놓고 잘 돌아가고 있지만 더 잘 쓸 수 있을 부분을 되돌아보고 있다.
그 첫 케이스로 특정 쿼리 튜닝을 공유해본다.
오라클이든 마리아DB(mariadb, mysql, auroradb)든모든 쿼리는 인덱스를 타느냐 안 타느냐가 튜닝의 포인트라고 생각한다. 물론 다른 예외적인 케이스도 있겠지만 전문 DBA가 아닌 이상 그 이상은 생각하지 않겠다. ㅋ
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif)
select *
from hits_stat
where 1=1
and year = ‘2025’
and month = ‘01’
and day = ‘15’
우선 테이블에 대한 간략한 설명을 하자면,
테이블 hits_stat은 key로 year, month, day의 컬럼으로 구성된 연동량 일일 통계 테이블이다.
추후 연별, 월별, 일자별 통계 수치를 편하게 grouping 하고자 저렇게 쿼리를 나눠서 설계하였다.
화면으로 부터 조회하고자 원하는 날짜값을 list로 전달받고는 아래와 같이 조회쿼리를 개발해서 서비스를 제공하고 있었다.
[AS-IS]
select *
from hits_stat
where 1=1
and concat(year,month,day) = #{reqMap.tgtDate}
초기데이터가 얼마 되지 않았을터라, 쿼리는 그닥 느리지 않았고, 이내 머리속에서 해당 화면은 잊혀져 갔다.
구축한 지 이제 3~4년이 지나고 괜한 추억에 빠져 하나씩 화면을 눌러보면 자화자찬에 빠져있을 때, 말도 안되는 속도를 뿜어내며 계속 pending되어있는 화면을 보게 되었다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/021.gif)
그렇다.
바로 저 놈이였다. 과하게 편하게 개발했던 저 인덱스 따위는 말아먹은 concat이 문제를 일으키기 시작했다.
4년 가까이 되면서 해당 테이블의 데이터는 점점 쌓여가기 시작했고, 테이블의 데이터는 나름 로그와 통계 사이 성격을 지닌터라 cutting대상에서 우선 제외했기에 적지 않은 수의 데이터를 유지하고 있었다.
4년동안 이렇게 스스로 체면하고 있었던 거였다.
해결책은 간단하다. 인덱스를 타도록 조회 조건을 수정해주면 된다.
[TOBE]
select *
from hits_stat
where 1=1
—- and concat(year,month,day) = #{reqMap.tgtDate}
and year = substr(#{reqMap.tgtDate},1,4)
and month = substr(#{reqMap.tgtDate},5,2)
and day = substr(#{reqMap.tgtDate},7,2)
테이블의 조회 대상이 되는 컬럼에는 별도의 가공을 최대한 하지 않고, 필요하면 조건파라미터에 가공을 하는 방법이 가장 기본적이다.
사실 그때도 몰랐던 건 아니였지만, 그땐 그닥 느리지 않은 쿼리를 믿고 묻어뒀었던 거 같다. 그래도 이번 기회에 개선을 하게 되어 나름 보람이 있었고, 시간이 있을 때마다 개선활동은 이렇게 기록까지 해보려고 한다.
이참에 위에 쿼리에 나온 함수 2개를 소개하고 마무리한다.
- CONCAT(문자열 합치기 함수) : 합치고자하는 파라미터를 CONCAT(‘합‘,‘치’,‘기‘)로 표현하면 ’합치기‘와 같은 결과를 얻을 수 있다.
- SUBSTR(문자열쪼개기 함수) : 위와 반대로 정해진 문자열을 정해진 값으로 쪼갤 수 있다. SUBSTR(‘20250105’, 1, 4)의 경우에는 ’20250105‘라는 문자열을 1번째 열부터 4자리를 짤라서 ’2024‘ 라는결과로 보여주게 된다.
#코드수정
#코드리팩토리
#쿼리
#튜닝
#튜닝별거아님
#concat
#substr
#인덱스
- Total
- Today
- Yesterday
- 정기승차권
- 포트포워드
- 2011
- 설정
- 클라우드 서비스
- ssd
- 라즈베리
- LTE
- 후기
- warp
- 갤럭시
- 클라우드
- 리눅스마스터
- 망중립성
- 비교
- CISSP
- 3G
- mac
- 포트포워딩
- PC
- 애플
- 공유기
- SKT
- infosecurity
- LTE요금제
- 삼성
- 요금
- 라즈베리 파이
- KT
- iptime
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |