쿼리문 질문드립니다
본문
$sql = "SELECT *,
(select count(*) from g5_write_" . $bo_table . " where ca_name = book.wt_idx) as wt_cnt,
(select max(wr_datetime) from g5_write_" . $bo_table . " where ca_name = book.wt_idx) as wt_last
FROM bookWHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;
$gresult = sql_query($sql);
이렇게 쿼리를 하면 게시물이 적으면 괜찮은데..게시물이 많아지면 504에러를 뿜어냅니다..어떻게 수정을 해야 부하없이 잘 불러올수 잇을까요? 따로 쿼리문을 빼야할까요?
!-->답변 5
우선 눈에 보이는건
FROM bookWHERE
=>
FROM book WHERE
떨어져야 할거 같은데요
게시물이 많아질때 다르게 해야 하는 조검이 명확하지 않은데
어떤걸 다르게 표현하려고 하시는건가요?
막연히 게시물이 많아서 504 에러가 난다 라고하시면
게시물이 적을땐 안난다는건데
문제의 원인이 쿼리만 볼때 문제를 말씀드리는거라면
select * from 테이블 하는 시점에
모든게시물 의 조건일경우
그 안에 서브쿼리가 또 selec count(*) from 테이블 과
select max(column) from 테이블을 수행하는것 자체가 문제 있습니다.
$where 의 내용에 따라 index를 주거나 하는 걸 조치해야 할겁니다.
limit 는 가급적 1페이지(수십 row내외)로 유지하는걸 권장하구요
많아지면 일단 느려져서 수행성능에 문제가 발생할수있습니다.
그외에 쿼리가 아닌 다른요인이 문제인지는 판단이 좀 애매합니다.
아.. 그렇군요
book 테이블은
g5_board 와 비슷한 기능인가보네요
<?php
$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;
$result = sql_query($sql);
while ($book = sql_fetch_array($result) {
$sql2 = "select count(*) cnt from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";
$r2 = sql_fetch($sql2);
$r2count = $r2['cnt']; // row별 카운트 사용
$sql3 = "select max(wr_datetime) datetime from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";
$r3 = sql_fetch($sql2);
$r3date = $r2['datetime']; // bo_table별 최종시간
// 필요하신 코드 추가
}
위와 같이 처리하시면 될듯 싶은데요
처음에 작성하신 방법대로 하면
카운트와 max값을 구하면서 Row를 긁어올때
과도한 부하가 걸립니다.
개별로 처리하시는게 더 깔끔하고 빠르게 처리됩니다.
!-->
$r3date = $r2['datetime']; // bo_table별 최종시간
여기를 $r3['datetime']; 으로 변경하셔야 겠네요
제가 변경을 누락했네요
잘 보니..
g5_write_".$bo_table."ca_name
에서
$bo_table."ca_name
에 띄어쓰기가 없네요
복붙시에 공백이 사라진듯 합니다.
다른부분에 쿼리가 정상인지
echo 로 $sql2;
echo $sql3;
찍어서 실행시켜보시면 정확할듯 싶네요