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

쿼리 질문 채택완료

장똥 2년 전 조회 1,695

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

</strong>

$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);

}

​​​​​​​// 코드생략

<strong>
 

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

답변 3개

채택된 답변
+20 포인트

주문 상태를 완료로 바꾸는 곳

amd/ shop_admin/oderformupdate.php

에서 처리 하는 것이 가장 좋아 보입니다.

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

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

2년 전

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

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

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

 

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

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

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

 

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

</p>

<p>-- 단일</p>

<p>... set mb_level = 5 where mb_id = '$mb_id';</p>

<p> </p>

<p>-- OR</p>

<p>... set mb_level = 5 where mb_id = '$mb_id_1' OR mb_id = '$mb_id_2' OR ... ;</p>

<p> </p>

<p>-- IN</p>

<p>... set mb_level = 5 where mb_id IN ('$mb_id_1', '$mb_id_2', ...);</p>

<p> </p>

<p>-- ALL</p>

<p>... set mb_level = 5</p>

<p>

 

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

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

답변에 대한 댓글 2개

장똥
2년 전
그렇다면 혹시 아래처럼 이용해도될까요 ?


[code]

$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);
}
[/code]
배르만
2년 전

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

프라푸치노K

common.php소스를 살펴보면

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

 

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

답변에 대한 댓글 1개

장똥
2년 전
감사합니다. 참고해보겠습니다 !

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

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

로그인