게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
이틀전에 여기서 조언을 얻어서 정리한 sql 쿼리 입니다.
게시물ID : programmer_3960짧은주소 복사하기
작성자 : 사이키
추천 : 0
조회수 : 596회
댓글수 : 2개
등록시간 : 2014/06/13 16:29:04


개발환경은 php , MySql 5.1.45 입니다.

우선 기본 베이스 테이블이 2개 이고
1번째는 게시물 테이블(g_board)
2번째는 첨부파일 테이블(g_attach) 입니다

워낙 연동하는 다른 테이블들이 많아서 view 테이블을 만들었었는데
게시물 한개당 최대 첨부 파일 갯수를 6개로 제한 해 두고 
처음 쿼리를

create view view_etc_tbl AS
select idx, ....... , 
(select CONCAT(attach_path,'/',attach_savename) from g_attach 
where b.idx = board_idx order by attach_idx asc limit 0, 1) as att_file1,
(select CONCAT(attach_path,'/',attach_savename) from g_attach 
where b.idx = board_idx order by attach_idx asc limit 1, 1) as att_file2,
.......,
from g_board order by idx desc
(다른 테이블들 과의 Join 들은 제외하고 주요코드만 정리한것입니다.)

뭐 이런식으로 짜서 view_etc_tbl 이란 뷰테이블을 만들었습니다.
그런데 저게 내부에서 select 문이 6번 이상을 돌게 되면서 
데이터 양이 많지 않음에도 불구하고
쿼리한번 호출하는데 2초 이상이 걸리게 되더라구요
(저 6개의 select문만 제거 하면 실행시간이 0.1초대로 줄어듭니다.)

그래서 상기 뷰테이블을 조인문으로 바꿔서 새로이 만들려고 시도 했으나 
MySql 에서는 뷰테이블을 만들시에 변수도 사용할 수 없고, 
또한 결정적으로 Sub쿼리를 쓸수 없게 되어있더라구요
그냥 sql 쿼리문으로 돌리면 잘 돌아가는데 이걸
뷰테이블로 만들려구하면 주구장창 
You have an error in your SQL syntax:~~~
뭐 이런 애러가 떠서 결국 중도에 포기 하고 말았습니다.
(꼼수로 서브쿼리에 들어갈 select 문을 view 테이블로 만들고 그
view 테이블을 참조해서 view 테이블을 만들려고
시도했는데 그것도 MySql에선 안되더군요... 내 오라클을 돌려줘..ㅠㅠ)

결국엔 뷰테이블 사용을 포기 하고 쿼리문에서
우선 

CREATE VIEW gb AS 
select 
max(f.board_idx) AS board_idx,
max(f.attach_path) AS attach_path,
group_concat(f.attach_savename order by f.board_idx ASC separator '|') AS attach_savename
from g_attach f group by f.board_idx;

로 gb라는 view 테이블을 만들고 그안에서 첨부파일이 포함된 폴더는 
게시물 별로 같으니 그냥 한 컬럼에 통일하고 첨부파일명은 '|' 라는 구분자로 구분해서
한컬럼에다 쭉 몰아넣어버렸습니다.

그다음에 include 되는 파일에서 

(SELECT
 b.idx as idx, .........,
 attach_path, attach_savename
 from 
 (select idx, ........., from g_board as FB left outer join gb as GB On FB.idx = GB.board_idx order by idx asc) AS b)
 AS TTD 

 라고 문자열 상수로 선언 해버리고 이전에 view_etc_tbl 을 참조하던부분을 선언된 상수로 바꿔버렸습니다.
 그러고 나니깐 기존에 
 att_file1 ~ 6 의 컬럼에 나오던 부분을
 attach_path 컬럼에 파일이 저장된 폴더가 나오고 
 attach_savename 에 '|'로 구분된 파일명 6개가 나오게 했습니다.
 결국엔 지금까지 view_etc_tbl 을 참조해서 att_file1~6까지 뿌려주던 php 파일 모두를 
 path와 savename 을 받아와서 구분자로 구분해서 하나로 합쳐주고 뿌려주게 바꿔야만 했는데요
 이런 작업을 해주니깐 기존 view 테이블을 참조하는 php 파일의 로딩속도가 약 3~4초였었는데..
 지금은 이미지 로딩까지 포함해서 0.7~0.8 초대로 체감속도가 확 달라졌습니다.

문제는 상수로 쓴 sql 쿼리문이 지금 제가 최대치로 줄여놔서 6줄이지만
실제 코드에 들어간 코드는 한글에서 치면 A4용지 2장을 조금 넘는 
어마어마한 길이의 쿼리문이 되어버렸다는거죠.....;;
(저 상수에 앞뒤로 붙는 쿼리문 까지 합치면 쿼리문 길이가 그야말로 ㅎㄷㄷ)
(난 이상하게 쿼리문이 길어지면 길어질수록 실행속도가 올라가더라는;;;)

뭐 저처럼 MySql 에서 게시물 리스트와 첨부파일이나 댓글리스트를 받아와서 한화면에 같이 
뿌려주어야 할 일이 생기신 분들께 좋은 활용방안이 될수있을꺼라 생각해서 올립니다.

혹시나 해서 질문드립니다.
저 위에 올린 쿼리문을 MySql에서 View테이블로 만들수는 정말 없는건가요....ㅡ.ㅜ
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호