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

검색 조회시간을 조금 빨리 하고 싶습니다. 채택완료

godglee 3년 전 조회 1,894

안녕하세요, 회사 직원들 출퇴근 과 근무시간등등 여러개 컬럼을 조회하고 있습니다.

30명가까이 되는데, 1개월로 조회하니,

10초넘게 걸려서 어떤부분을 수정해야되는지 문의 드립니다.

첫번째 반복: 직원명 조회,

두번째 반복: 직원명 해당되는 검색 시작일부터 +1일로 조회,

 

개발 초보입니다. 많은 도움 부탁드립니다. 감사합니다. 

</p>

<p><?php

include_once('./_common.php');

include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php');

include_once('./admin_list.lib.php');</p>

<p>$s_week .= calculate_prev_week($startday)." 00:00:00";

$e_week .= calculate_next_week($startday)." 23:59:59";

$n_dahg .= calculate_month_startday_list7($startday)." 00:00:00";

$e_dahg .= calculate_month_endday_list7($startday)." 23:59:59";</p>

<p>if(!$endday){

    $startday = calculate_prev_week($startday);

    $endday = date("Y-m-d", strtotime($startday." +6 day"));

}

?>

<!-- 필수 JS/CSS { -->

<link type="text/css" href="./adminlist/style.css" rel="stylesheet" />

<link type="text/css" href="./adminlist/style-adminlist4.css" rel="stylesheet" />

<script type="text/javascript" src="./adminlist/jquery.min.js"></script>

<script type="text/javascript" src="./adminlist/jquery-ui.min.js"></script>

<!-- } --></p>

<p><table  cellpadding=0 cellspacing=0 align=center >

    <tr>

        <td colspan=10 align=center>

        <form method="post" action="admin_list7.php">

        <input type="hidden" name="bo_table"  value='<?=$bo_table?>'>

            이름 : <input type="text" name="n_nmame" class="frm_input" value='<?=$n_nmame?>' size=10>

        <input type="text" name="startday" value="<?php echo $startday; ?>" id="startday" class="datepicker frm_input" placeholder="시작일" readonly="true" /> ~ 

        <input type="text" name="endday" value="<?php echo $endday; ?>" id="endday" class="datepicker frm_input" placeholder="종료일" readonly="true" />

            </br></br>

        <div>

            <input type="submit" value='검색'>   

            <button type="button" onclick="javascript:set_date('오늘');" class="date_btn">오늘</button>

            <button type="button" onclick="javascript:set_date('어제');" class="date_btn">어제</button>

            <button type="button" onclick="javascript:set_date('이번주');" class="date_btn">이번주</button>

            <button type="button" onclick="javascript:set_date('이번달');" class="date_btn">이번달</button>

            <button type="button" onclick="javascript:set_date('지난주');" class="date_btn">지난주</button>

            <button type="button" onclick="javascript:set_date('지난달');" class="date_btn">지난달</button>

        </div>

        </form>

        </td>

    </tr>

</table></p>

<p>    </br></br></p>

<p><div id="hanbit_gantchart">

<table >

    <tr>

        <th align=center width="3%">순서</th>

        <th align=center width="4%">이름</th>

        <th align=center width="4%">내용</th>

        <?php calculate_view_list7($startday,$endday); ?>

        <th align=center width="3%">근무
일수</th>

        <th align=center width="4%">근무
시간</th>

        <th align=center width="4%">평균
근무
시간</th>

        <th align=center width="4%">오버
타임</th>

    </tr></p>

<p>    <?

        $sql_search .= " where mb_name ='{$n_nmame}'"; // 최고관리자 제외

        $sql_order = " order by mb_name";</p>

<p>

    $sql = " select mb_name from {$g5['member_table']} {$sql_search} {$sql_order}";

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

<p> </p>

<p>//직원명 조회</p>

<p>

    for ($i=0; $rows=sql_fetch_array($result); $i++) {

        $y++;

        $mb_name = $rows['mb_name'];</p>

<p>        ?>

        <tr >

            <td align=center><strong><?php echo $y ?></strong></td>

            <td align=center><strong ><?php echo $mb_name?></strong></td>

            <td align=center><strong >

            <div class="office_time_go">출근시간: </div>

            <div class="office_time_end">퇴근시간: </div>

            <div class="office_time_alltime">근무시간: </div>

            <div class="office_time_overtime">오버타임: </div>

            </strong></td>

        <?php

            </p>

<p>//직원명으로 검색(시작일과 종료일)로 조회</p>

<p>

        for($a=0; $a<count_list7($startday, $endday); $a++){

            $beforeDay = date("Y-m-d", strtotime($startday." +$a day"));

            $sql_office_time = "SELECT wr_2, wr_7,wr_15,wr_16,wr_3,wr_4 FROM $write_table WHERE wr_is_comment = 0 and wr_3 LIKE '%$beforeDay%' and wr_name ='$mb_name'";

            $result_office_time = sql_query($sql_office_time);

            $row=sql_fetch_array($result_office_time);

            

            $yoil = calculate_yoil($beforeDay);

            </p>

<p>        if($row['wr_3'] && (!$row['wr_2'] || strpos($row['wr_2'], "오전") || strpos($row['wr_2'], "오후")) ){

            ?>

            <td align=center> </p>

<p>                    <div class="office_time_go"><?php echo substr($row['wr_3'], 11, 5); ?></div>

                    <div class="office_time_end"><?php if($row['wr_3'] != $row['wr_4']) echo substr($row['wr_4'], 11, 5); ?></div>

                

                <?php if(!$row['wr_7']){ ?> 

                    <div class="office_time_alltime" style="background-color:#efefef;" title="<?php echo substr($row['wr_3'], 11, 5); ?> ~ <?php echo substr($row['wr_4'], 11, 5); ?>">

                <?php }else { ?> 

                    <div class="office_time_alltime" >

                <?php } ?> 

                    <font style="padding-top:3px"> <?php echo str_replace("시간", "시간
", $row['wr_7']); ?></font> </div></p>

<p>                <?php if($row['wr_2']){ ?> 

                    <div class="office_time_overtime" style="background-color:#92d050;">

                <?php }else { ?> 

                    <div class="office_time_overtime" >

                <?php } ?> <div><?php if($row['wr_2']){ echo $row['wr_2']; }else{ echo str_replace("시간", "시간
", $row['wr_15']); } ?></div>

                    </div>

            </td></p>

<p>            <?php

        }else if($row['wr_2']) {

            ?>

            <td >

            <div class="office_time_go"></div>

            <div class="office_time_end"></div>

            <div class="office_time_alltime"></div>

            <div class="office_time_overtime" style="background-color:#92d050;"><?php echo $row['wr_2'] ?></div></td>

            <?php

        }else{

            ?>

            <td>

            <div class="office_time_go"></div>

            <div class="office_time_end"></div>

            <div class="office_time_alltime"></div>

            <div class="office_time_overtime"></div>

            </td>

            <?php

        }

            ?></p>

<p>        <?php 

        }

            $count_endday = date("Y-m-d", strtotime($endday." +1 day"));</p>

<p>            $sql_office_overtime = "SELECT sum(wr_8),sum(wr_16) FROM $write_table WHERE wr_is_comment = 0 and wr_3 between '$startday' and '$count_endday'  and wr_name ='$mb_name'";

            $result_office_overtime = sql_query($sql_office_overtime);

            $row_office_overtime=sql_fetch_array($result_office_overtime);

            

            $sql_office_day = "SELECT count(*) FROM $write_table WHERE wr_is_comment = 0 and wr_3 between '$startday' and '$count_endday'  and wr_name ='$mb_name'";

            $result_office_day = sql_query($sql_office_day);

            $row_office_day=sql_fetch_array($result_office_day);

        ?>

            <td align=center> 

            <?php echo $row_office_day['count(*)']; ?>일

            </td>

            <td align=center> 

            <?php echo office_time($row_office_overtime['sum(wr_8)']); ?>

            </td>

            <td align=center> 

            <?php echo office_time_avg($row_office_overtime['sum(wr_8)'], $row_office_day['count(*)']); ?>

            </td>

            <td align=center> 

            <?php if($row_office_overtime['sum(wr_16)']) echo office_time($row_office_overtime['sum(wr_16)']); ?>

            </td></p>

<p>        </tr>

    <?php

    } 

    ?></p>

<p></table>

</div></p>

<p><?php

//include_once(G5_PATH.'/tail.php');

?></p>

<p><script type="text/javascript">

// 달력 시작

//<![CDATA[

$(function(){

    $(".targetFocus").click(function(){

        $($(this).data("target")).focus();

    });

});

//]]>

// 달력 끝

</script></p>

<p><!-- 캘린더 옵션 { -->

<script>

$.datepicker.setDefaults({

    closeText: "닫기",

    prevText: "이전달",

    nextText: "다음달",

    currentText: "오늘",

    monthNames: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월"],

    monthNamesShort: ["1월", "2월", "3월", "4월", "5월", "6월","7월", "8월", "9월", "10월", "11월", "12월"],

    dayNames: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],

    dayNamesShort: ["일", "월", "화", "수", "목", "금", "토"],

    dayNamesMin: ["일", "월", "화", "수", "목", "금", "토"],

    weekHeader: "주",

    dateFormat: "yy-mm-dd", // 날짜형태 예)yy년 m월 d일

    firstDay: 0,

    isRTL: false,

    showMonthAfterYear: true,

    yearSuffix: "년"

    })

    $(".datepicker").datepicker({

    })

    </script></p>

<p><script type="text/javascript">

// 달력 시작

//<![CDATA[

$(function(){

    $(".datepicker").datepicker({

        dateFormat: "yy-mm-dd",

        

    });

    $(".targetFocus").click(function(){

        $($(this).data("target")).focus();

    });

});

//]]>

// 달력 끝</p>

<p>    $(function(){

        $(".startday, .endday").datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", showButtonPanel: true, yearRange: "c-99:c+99", maxDate: "+0d" });

        //$(".set_date").datetimepicker({ changeMonth: true, changeYear: true, dateFormat: "yy/mm/dd", timeFormat:"HH:mm:ss", controlType:"select", oneLine:true, showButtonPanel: true, yearRange: "c-99:c+99", maxDate: "+0d" });

    });</p>

<p>    function set_date(today)

    {

        <?php

        $date_term = date('w', G5_SERVER_TIME);

        $week_term = $date_term + 7;

        $last_term = strtotime(date('Y-m-01', G5_SERVER_TIME));

        ?>

        if (today == "오늘") {

            document.getElementById("startday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME);; ?>";

        } else if (today == "어제") {

            document.getElementById("startday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME - 86400); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME - 86400); ?>";

        } else if (today == "이번주") {

            document.getElementById("startday").value = "<?php echo date('Y-m-d', strtotime('-'.$date_term.' days', G5_SERVER_TIME)); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";

        } else if (today == "이번달") {

            document.getElementById("startday").value = "<?php echo date('Y-m-01', G5_SERVER_TIME); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-d', G5_SERVER_TIME); ?>";

        } else if (today == "지난주") {

            document.getElementById("startday").value = "<?php echo date('Y-m-d', strtotime('-'.$week_term.' days', G5_SERVER_TIME)); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-d', strtotime('-'.($week_term - 6).' days', G5_SERVER_TIME)); ?>";

        } else if (today == "지난달") {

            document.getElementById("startday").value = "<?php echo date('Y-m-01', strtotime('-1 Month', $last_term)); ?>";

            document.getElementById("endday").value = "<?php echo date('Y-m-t', strtotime('-1 Month', $last_term)); ?>";

        } else if (today == "전체") {

            document.getElementById("startday").value = "";

            document.getElementById("endday").value = "";

        }

    }</p>

<p></script></p>

<p> </p>

<table border="0" cellpadding="0" cellspacing="0" width="72">
	<tbody>
		<tr height="22">
			<td height="22" width="72">wr_1:공휴일출근여부,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_2:휴가종류,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_3:출근시간,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_4:퇴근시간,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_5:출근지역,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_6:퇴근지역,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_7:근무시간,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_8:근무시간유닉스,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_9:출근지역-기타지역,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_10:퇴근지역-기타지역 ,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_11,12 : 출근 지점명, 도로명, </td>
		</tr>
		<tr height="22">
			<td height="22">wr_13,14 : 퇴근 지점명, 도로명,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_15:오버타임시간,</td>
		</tr>
		<tr height="22">
			<td height="22">wr_16:오버타임유닉스</td>
		</tr>
	</tbody>
</table>

<p>

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

답변 3개

채택된 답변
+20 포인트

db 테이블인덱스구성이 어떻게 되어 있나요?

 

불필요한 query 문이 많군요.

 

$write_table 게시판에

index ( wr_name, wr_3) 정도만 추가해도 효과가 있을 듯하군요.

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

답변에 대한 댓글 2개

g
godglee
3년 전
엑스엠엘 님, 감사합니다, 인텍스 추가했더니 많이 빨라졌네요.
엑스엠엘
3년 전
급한 불?을 껐껬지만
프로그램 튜닝도 필요합니다.

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

3년 전

쿼리문 최소화, 인덱스 설정, 캐시 설정 크게 가면 검색 테이블을 따로 만드는것이 나을수도 있습니다.

우선 쿼리를 최대한 간결하게 하시고, 그 후에도 속도 문제가 된다면 인덱스 설정식으로 고민하시는것이 좋습니다

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

답변에 대한 댓글 1개

l
lpool
3년 전
내용과 관계없이 진짜 뜬금없는 댓글입니다만, 만드시는 테마 늘 잘 쓰고있습니다!

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

우선 쿼리를 sql에서 개별로 실행해보시는것이 좋을듯 싶네요

실행해서 시간체크 하시고 만일 개별로 실행했을때 시간이 1초를 넘어간다면 쿼리를 개선해야 할듯 싶네요.. 조건절에서 가장 많이 걸려지는 큰 조건부터 순차적으로 작성하시는게 좋구요....

그래도 느리다면 인덱스를 활용하셔야 할것 같습니다.

그리고 쿼리를 반복문으로 돌릴것 아니면 그냥 sql_fetch($sql_office_overtime); 로 해주시는게 좋아 보입니다. 성능면에서 별차이는 없다고 하지만 그래도 sum row가 단일행인데 sql_fetch_array를 쓸필요는 없을듯 싶네요... 저역시 고수는 아니니 그냥 참고하시는 정도로만 여겨주세요

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

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

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

로그인