쿼리문 질문드립니다

쿼리문 질문드립니다

QA

쿼리문 질문드립니다

본문


$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내외)로 유지하는걸 권장하구요

 

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

 

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

 

 


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


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

아.. 그렇군요

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를 긁어올때 

과도한 부하가 걸립니다.

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

 

 

 

 


$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();


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

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

 

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

제가 변경을 누락했네요

 

잘 보니..

g5_write_".$bo_table."ca_name 

 

에서

$bo_table."ca_name 

에 띄어쓰기가 없네요

 

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

 

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

echo 로 $sql2;

echo $sql3;

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

답변을 작성하시기 전에 로그인 해주세요.
전체 36
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT