쿼리 질문

쿼리 질문

QA

쿼리 질문

답변 3

본문

아래 쿼리 로 특정 조권이되면 회원레벨 업 및 다운 을 시키는 쿼리를 유저가 로그인할때마다 체크해서. 로그인 한 ID 만 작동하는 쿼리인데요~
이게 매 로그인 시마다 쿼리가 돌아가는데.
서버에 부하 가 발생할까요 ~?
아니면 로그인 한 ID 가아닌.  재가 스케줄러로 실행되어서 전체회원 을 싹 검토한후에 한번에 업/다운 업데이트를 하는게괜찮은지 질문드립니다.
또한 로그인 한 ID 가 아닌 전체회원 기준으로 는 어떻게 쿼리를 수정하면좋을지 쿼리 답변 부탁드리겠습니다.


$mb_id = $member['mb_id'];
if($mb_id != "admin"){
$sql_sum = " SELECT SUM(od_cart_price) as total_price FROM {$g5['g5_shop_order_table']} 
WHERE mb_id = '$mb_id' 
AND od_time >= DATE_SUB(NOW(), INTERVAL 12 MONTH) 
AND od_status = '완료'";
$sum_result = sql_fetch($sql_sum);
$total_price = $sum_result['total_price'];
if // 코드생략 {
    $sql_level = "update {$g5['member_table']} set mb_level = 5 where mb_id = '$mb_id'";
    sql_query($sql_level);
}
​​​​​​​// 코드생략
 

이 질문에 댓글 쓰기 :

답변 3

common.php소스를 살펴보면

[// 오늘 처음 로그인이라면] 이런 주석이 있을거에요 이부분 참고해서 조건을 추가하세요.

 

https://github.com/gnuboard/gnuboard5/blob/master/install/gnuboard5shop.sql#L691

index 는 mb_id 가 설정되어 있지만 시간이 지남에 따라 데이터가 누적되는 형태이므로

데이터 분포도에 따라 부하는 그만큼 가중됩니다.

 

인덱스를 추가하고 쿼리를 그에 맞게 최적화 해볼수 있겠으나

12개월 치의 자료를 수집하는 부분이 있는만큼 별도의 프로세스로

전체대상 스케줄링 하는 방법이 더 나을것 같습니다.

 

대상기준 구분은 당연하겠지만 where 이하절에서 판단되도록 하면 됩니다.


-- 단일
... set mb_level = 5 where mb_id = '$mb_id';
 
-- OR
... set mb_level = 5 where mb_id = '$mb_id_1' OR mb_id = '$mb_id_2' OR ... ;
 
-- IN
... set mb_level = 5 where mb_id IN ('$mb_id_1', '$mb_id_2', ...);
 
-- ALL
... set mb_level = 5

 

이런 경우는 대상이 되는 mb_id 를 추출해 IN 으로 쿼리하는 방법이 일반적 입니다.

그렇다면 혹시 아래처럼 이용해도될까요 ?




$sql_sum = " SELECT mb_id, SUM(od_cart_price) as total_price FROM {$g5['g5_shop_order_table']} 
WHERE od_time >= DATE_SUB(NOW(), INTERVAL 12 MONTH) 
AND od_status = '완료'
GROUP BY mb_id";
$result = sql_query($sql_sum);

while($sum_result = sql_fetch_array($result)) {
  $total_price = $sum_result['total_price'];
  $mb_id = $sum_result['mb_id'];

  if ($mb_id == "admin") {
    continue;
  }

  if //코드생략 {
    $mb_level = 5;
  }
  elseif (//코드생략) {
    $mb_level = 4;
  }
  elseif (//코드생략) {
    $mb_level = 3;
  }
  elseif (//코드생략) {
    $mb_level = 2;
  }
  
  $sql_level = "UPDATE {$g5['member_table']} SET mb_level = '$mb_level' WHERE mb_id = '$mb_id'";
  sql_query($sql_level);
}

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
filter #sql ×
전체 728
© SIRSOFT
현재 페이지 제일 처음으로