Extra Form
PHP PHP 7.2
CMS Rhymix 2.0
$EXCEL_FILE = "

<table border='1'>
    <tr>
       <td>이름</td>
       <td>지점</td>
       <td>상담건수</td>
       <td>성공건수</td>
       <td>성공률</td>
    </tr>
";
                   
    $conn = mysqli_connect("localhost","**","**","**"); 
      if (mysqli_connect_error($conn)){ 
        echo "페이지에 접속할 수 없습니다.<br><br>"; 
      } 
mysqli_query($conn, "set names utf8");
$sql = "select * FROM placecode";
$result = mysqli_query($conn, $sql);

    while ($row= mysqli_fetch_array($result)){ 
          $name = $row['name'];
        $place = $row['place'];
$EXCEL_FILE .= "

    <tr>
       <td>".$name."</td>
       ";
    $conn2 = mysqli_connect("**","**","**","**"); 
      if (mysqli_connect_error($conn)){ 
        echo "페이지에 접속할 수 없습니다.<br><br>"; 
      } 
          
mysqli_query($conn2, "set names utf8");
    $sql4 = "SELECT place, item, success, COUNT(*) AS cnt FROM report WHERE item IN ('$menusearch') AND name='$name' AND $date2 GROUP BY place, item, success;";
    $result4 = mysqli_query($conn2, $sql4) ;
                              $bigitem = 0;
    
               while ($row4= mysqli_fetch_array($result4)){ 
          $cnt = $row4['cnt'];
                  
                 $bigitem = $bigitem+$cnt;}
                              
mysqli_query($conn2, "set names utf8");
    $sql5 = "SELECT place, item, success, COUNT(*) AS cnt FROM report WHERE success IN ('O') AND item IN ('$menusearch') AND $date2 AND name='$name' GROUP BY place, item, success;";
    $result5 = mysqli_query($conn2, $sql5);
                              $bigitemok = 0;
               while ($row5= mysqli_fetch_array($result5)){ 
          $cnt = $row5['cnt'];
                 $bigitemok = $bigitemok+$cnt;
                
               }
                              
                                if($bigitemok > 0){    
    $bigavg = round(($bigitemok/$bigitem)*100, 1);
          }else($bigavg = 0);
        
        
        $EXCEL_FILE .= "
       <td>".$place."</td>

       <td>".$bigitem."</td>

       <td>".$bigitemok."</td>

       <td>".$bigavg."</td>

    </tr>

";

}

$EXCEL_FILE .= "</table>";

 

 

A테이블에 상담원들의 이름과 소속 리스트가있습니다.

 

while로 이름명단을 쭉 나열해서 그안에 상담건수와 성공건수를 출력하여 엑셀저장을 하려고합니다..

 

그런데 실행시 39초 후에 다운로드가 되네요.

저런식으로 while 안에 while 반복문을 사용하고 sql 검색범위가 넓은? 경우에는 어쩔수없는걸까요??

 

sql , php에 대한 개념이 부족하다보니 코드자체도 엉망이고.. 민망하네요

더욱 효과적으로 sql을 불러올 방법은 없을까요??

 

 

읽어주셔서 감사드리며, 활기찬 한주 보내세요 ! 

  • profile
    디비쿼리는 사실 얼마 걸리지 않을거예요. 아무리 막 짠 코드거나 최적화가 안되었다 하더라도 1000명정도를 가져오는데 1초~2초 남짓일텐데 대부분 엑셀로 데이터를 넣는 과정에서 발생되겠지요.

    엑셀라이브러리 넣는것 자체가 원래 좀 시간이 걸리니.. 필요하다면 http으로 요청하지말고 터미널에서 PHP파일을 실행하도록 하여 안전하게 데이터를 옮기시는게 낫습니다.
  • profile profile
    헉 람보님 답변 감사합니다!
    저 report라는 테이블에는 9만건정도 데이터가있구
    인원은 500명정도라..

    근데 컴퓨터친구들은 초당 수십억회?의 연산을 하지않나요?!

    지난번 기진곰님께서 답변을 주셨던 게시글에서는 엑셀아니고 sql+php로 단순 테이블 출력인데도.. 쿼리를 한 60개 넣어서그런지 페이지 띄우는것도 10초정도 걸리더라구요..

    그래서 이것도 쿼리의 문제라고 생각했네요!
  • profile profile
    "근데 컴퓨터친구들은 초당 수십억회?의 연산을 하지않나요?!"

    그건 반복문으로 단순히 값을 추가하거나 없애거나 등등 이런 작업에서만 연산을 빠르게 한답니다.

    DB쿼리는 애초에 연산중에서도 그 항목들이 여러가지 얽히고 섥혀있는 관계라 당연히 일반적인 연산보단 느립니다..ㅋㅋㅋ
  • profile profile
    허허 어렵고 어렵네요
    쿼리를 좀 손봤는데 기존 39초에서 16초정도로 단축됬습니다!
    상담건수 count와 판매성공건 count를 한 쿼리에서 검색하니 단축이 되었네요!
  • profile

    루프(23~76줄) 안에서 쿼리를 돌리면 당연히 시간이 오래 걸립니다... 예를 들어 첫 번째 쿼리에서 결과가 1000개 나온다면 루프 안에서 2개의 쿼리를 돌리니까 총 2001번 쿼리를 해야 하잖아요. 각각의 쿼리가 0.01초만 걸려도 합계 20초 이상 걸릴 수 있다는 뜻입니다. 물론 첫 번째 쿼리 결과의 갯수가 적다면 계산이 달라지겠지만, 대략 비슷한 원리입니다. 쿼리 갯수 앞에 장사 없어요. (심지어 루프 안에서 DB 재접속을 하고 있네요... ㄷㄷㄷ)

     

    JOIN을 잘 사용해서 루프 없이 총 2~3번의 쿼리만으로 모든 결과를 다 받아온 후, PHP단에서 정리하여 출력한다면 훨씬 빠를 것입니다.

     

    문자열을 계속 덧붙이기보다는 그냥 echo 하는 것이 조금 더 효율적일 수도 있지만, 쿼리 소요시간에 비하면 이 부분은 별 것 아닐 가능성이 높습니다.

  • profile

    아하 JOIN 메모.. 하겠습니다
    Join 사용법을 익혀서 코드를 다시 짜보아야겠네요 항상 도움주셔서 정말 감사합니다 기진곰님!

     

    추가) 기진곰님의 댓글을 보고 제 코드를 보니까 제가봐도 웃기는 코드네요..ㅋㅋ 공부해서 수정하고 후기 올려보겠습니다!!

  • profile profile
    쿼리가 안에서 몇번씩 더돌아가고 있엇네요 6만개 정도 데이터를 먼저 불러오셧던거라면 그걸 반복으로 하나하나 쿼리문 다시 루트돌렸으면 문제가 발생되긴 합니다 ㅎㅎ 꼼꼼히 보지 못해서 죄송해용 ㅠ
  • ?
    while 반복문안에서 31번줄 conn2 DB접속시키네요??? 반복적으로 계속 접속하면 DB커넥션이 남아나질 않을꺼예요
  • ? profile
    뉴피치님 감사합니다!
    말씀주신대로 31번줄 conn2는 삭제했습니다!
    왜 저렇게 짠건지도 모르겠네요 ㅋㅋ
  • profile profile
    맨 처음 쿼리 결과를 모두 fetch하기 전에 다른 쿼리를 하면 오류가 날 수 있습니다.
    fetch하는 도중에 루프 안에서 다른 쿼리를 하도록 만드셨으니
    아마 에러를 방지하기 위해 루프 안에서는 다른 커넥션을 사용하도록 하신 것 같네요.
  • profile profile
    정확한 이유를 모르고 혹시 이것때문에 오류가 나나 이것저것 건드려보다 저렇게 된것같아요 지워서 실행해보니 또 되네요..
  • profile profile
    결국 루프하나에 모두넣어서 클릭과 동시에 지연없이 다운로드되게되었습니다~
    감사합니다~