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

매출이 오르면 내리는 수수료! 지금 수수료센터에서 전자결제(PG)수수료 비교견적 신청해 보세요!
검색 조회시간을 조금 빨리 하고 싶습니다.

QA

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

본문

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

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

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

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

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

 

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


<?php
include_once('./_common.php');
include_once(G5_PLUGIN_PATH.'/jquery-ui/datepicker.php');
include_once('./admin_list.lib.php');
$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";
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>
<!-- } -->
<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>
    </br></br>
<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%">근무<br>일수</th>
        <th align=center width="4%">근무<br>시간</th>
        <th align=center width="4%">평균<br>근무<br>시간</th>
        <th align=center width="4%">오버<br>타임</th>
    </tr>
    <?
        $sql_search .= " where mb_name ='{$n_nmame}'"; // 최고관리자 제외
        $sql_order = " order by mb_name";

    $sql = " select mb_name from {$g5['member_table']} {$sql_search} {$sql_order}";
    $result = sql_query($sql);
 
//직원명 조회

    for ($i=0; $rows=sql_fetch_array($result); $i++) {
        $y++;
        $mb_name = $rows['mb_name'];
        ?>
        <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
            
//직원명으로 검색(시작일과 종료일)로 조회

        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);
            
        if($row['wr_3'] && (!$row['wr_2'] || strpos($row['wr_2'], "오전") || strpos($row['wr_2'], "오후")) ){
            ?>
            <td align=center> 
                    <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("시간", "시간<br>", $row['wr_7']); ?></font> </div>
                <?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("시간", "시간<br>", $row['wr_15']); } ?></div>
                    </div>
            </td>
            <?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
        }
            ?>
        <?php 
        }
            $count_endday = date("Y-m-d", strtotime($endday." +1 day"));
            $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>
        </tr>
    <?php
    } 
    ?>
</table>
</div>
<?php
//include_once(G5_PATH.'/tail.php');
?>
<script type="text/javascript">
// 달력 시작
//<![CDATA[
$(function(){
    $(".targetFocus").click(function(){
        $($(this).data("target")).focus();
    });
});
//]]>
// 달력 끝
</script>
<!-- 캘린더 옵션 { -->
<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>
<script type="text/javascript">
// 달력 시작
//<![CDATA[
$(function(){
    $(".datepicker").datepicker({
        dateFormat: "yy-mm-dd",
        
    });
    $(".targetFocus").click(function(){
        $($(this).data("target")).focus();
    });
});
//]]>
// 달력 끝
    $(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" });
    });
    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 = "";
        }
    }
</script>
 

	
		
			wr_1:공휴일출근여부,
		
		
			wr_2:휴가종류,
		
		
			wr_3:출근시간,
		
		
			wr_4:퇴근시간,
		
		
			wr_5:출근지역,
		
		
			wr_6:퇴근지역,
		
		
			wr_7:근무시간,
		
		
			wr_8:근무시간유닉스,
		
		
			wr_9:출근지역-기타지역,
		
		
			wr_10:퇴근지역-기타지역 ,
		
		
			wr_11,12 : 출근 지점명, 도로명, 
		
		
			wr_13,14 : 퇴근 지점명, 도로명,
		
		
			wr_15:오버타임시간,
		
		
			wr_16:오버타임유닉스
		
	


이 질문에 댓글 쓰기 :

답변 3

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

 

불필요한 query 문이 많군요.

 

$write_table 게시판에

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

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

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

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

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

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

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

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

회원로그인

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