테스트 사이트 - 개발 중인 베타 버전입니다

쿼리문 질문드립니다 채택완료

Darcy 8년 전 조회 2,316

</p>

<p>$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;</p>

<p>$gresult = sql_query($sql);</p>

<p>

 

이렇게 쿼리를 하면 게시물이 적으면 괜찮은데..게시물이 많아지면 504에러를 뿜어냅니다..어떻게 수정을 해야 부하없이 잘 불러올수 잇을까요? 따로 쿼리문을 빼야할까요?

댓글을 작성하려면 로그인이 필요합니다.

답변 5개

채택된 답변
+20 포인트
플래토
8년 전

우선 눈에 보이는건

FROM bookWHERE

=>

FROM book WHERE 

떨어져야 할거 같은데요

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

D
Darcy
8년 전
복붙하다가 붙어버렸네요..ㅎㅎ;; 저부분을 나눠서 하거나 다르게 수정할수 있는 방법은 없을까요?

댓글을 작성하려면 로그인이 필요합니다.

플래토
8년 전

잘 보니..

g5_write_".$bo_table."ca_name 

 

에서

$bo_table."ca_name 

에 띄어쓰기가 없네요

 

복붙시에 공백이 사라진듯 합니다.

 

다른부분에 쿼리가 정상인지

echo 로 $sql2;

echo $sql3;

찍어서 실행시켜보시면 정확할듯 싶네요

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

플래토
8년 전

$r3date = $r2['datetime']; // bo_table별 최종시간

 

여기를 $r3['datetime']; 으로 변경하셔야 겠네요 

제가 변경을 누락했네요

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 1개

D
Darcy
8년 전
해당 쿼리를 불러오지를 못하고 있습니다..ㅠ_ㅠ 합치면 다 불러오는데 단일로 하면 못 불러오는걸까요?

댓글을 작성하려면 로그인이 필요합니다.

플래토
8년 전

아.. 그렇군요

book 테이블은 

 

g5_board 와 비슷한 기능인가보네요

 

 

</p>

<p><?php</p>

<p> </p>

<p>$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;</p>

<p>$result = sql_query($sql);</p>

<p>while ($book = sql_fetch_array($result) {</p>

<p>    $sql2 = "select count(*) cnt  from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";</p>

<p>    $r2 = sql_fetch($sql2);</p>

<p>    $r2count  = $r2['cnt'];  // row별 카운트 사용</p>

<p>    $sql3 = "select max(wr_datetime) datetime  from g5_write_".$bo_table." ca_name = '".$book['wt_idx']."' ";</p>

<p>    $r3 = sql_fetch($sql2);</p>

<p>    $r3date  = $r2['datetime'];  // bo_table별 최종시간</p>

<p> </p>

<p>   // 필요하신 코드 추가</p>

<p>}</p>

<p>

 

위와 같이 처리하시면 될듯 싶은데요

 

처음에 작성하신 방법대로 하면 

카운트와 max값을 구하면서 Row를 긁어올때 

과도한 부하가 걸립니다.

개별로 처리하시는게 더 깔끔하고 빠르게 처리됩니다.

 

 

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

D
Darcy
8년 전
플래토님이 알려주신 방법으로 한번해보고 잘안되면 다시 여쭈어보겠습니다^^
D
Darcy
8년 전
[code]
$sql = "SELECT count(*) as cnt FROM book WHERE bo_table='".$bo_table."'".$where;
$rs = sql_fetch($sql);
$wtotal_count = $rs["cnt"];

$wpage_rows = WT_COVER_CNT;
$wtotal_page = ceil($wtotal_count / $wpage_rows); // 전체 페이지 계산

$wfrom_record = ($wpage - 1) * $wpage_rows; // 시작 열을 구함

$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;

$gresult = sql_query($sql);

while ($book = sql_fetch_array($gresult) {
$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별 최종시간

// 필요하신 코드 추가
}

$glist = array();
[/code]

이렇게 적용하니 적용이 안됩니다..어디가 잘못되었을까요ㅠ?

댓글을 작성하려면 로그인이 필요합니다.

플래토
8년 전

게시물이 많아질때 다르게 해야 하는 조검이 명확하지 않은데

어떤걸 다르게 표현하려고 하시는건가요?

 

막연히 게시물이 많아서 504 에러가 난다 라고하시면

게시물이 적을땐 안난다는건데

문제의 원인이   쿼리만 볼때 문제를 말씀드리는거라면

 

select * from 테이블 하는 시점에

모든게시물 의 조건일경우

그 안에 서브쿼리가 또 selec count(*) from 테이블 과

select max(column) from 테이블을 수행하는것 자체가 문제 있습니다.

 

$where 의 내용에 따라 index를 주거나 하는 걸 조치해야 할겁니다.

limit 는 가급적 1페이지(수십 row내외)로 유지하는걸 권장하구요

 

많아지면 일단 느려져서 수행성능에 문제가 발생할수있습니다.

 

그외에 쿼리가 아닌 다른요인이 문제인지는 판단이 좀 애매합니다.

 

 

로그인 후 평가할 수 있습니다

답변에 대한 댓글 3개

D
Darcy
8년 전
지금 쿼리문이 날짜와 해당게시물 숫자 와 표지 이렇게 3개를 가져오고있습니다 이거를 따로 각각 불러올려고하면 어떻게 수정을 해야하는게 좋을지 좀 가르쳐주십시요..
플래토
8년 전
@Darcy 사용하시려는 내용이
wr_id, wr_datetime , count

이렇게 인가요?

또 그게 단일건인지 멀티(Row)에 해당되는건인지에 따라 좀 다릅니다.
D
Darcy
8년 전
[code]
$sql = "SELECT * FROM book WHERE bo_table='".$bo_table."'".$where." ORDER BY wt_idx ASC LIMIT ".$wfrom_record.", ".$wpage_rows;
[/code]

이게 원본소입니다..거기에 게시물 수와 시간을 추가했는데..원본을 사용하면 부하없이 빠릅니다..그런데
위에 소스처럼 추가하면 부하가 심해서 단일로 각각 불러낼려고 합니다..

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인