검색 조회시간을 조금 빨리 하고 싶습니다.
본문
안녕하세요, 회사 직원들 출퇴근 과 근무시간등등 여러개 컬럼을 조회하고 있습니다.
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를 쓸필요는 없을듯 싶네요... 저역시 고수는 아니니 그냥 참고하시는 정도로만 여겨주세요
쿼리문 최소화, 인덱스 설정, 캐시 설정 크게 가면 검색 테이블을 따로 만드는것이 나을수도 있습니다.
우선 쿼리를 최대한 간결하게 하시고, 그 후에도 속도 문제가 된다면 인덱스 설정식으로 고민하시는것이 좋습니다
답변을 작성하시기 전에 로그인 해주세요.