쿼리 질문
본문
아래 쿼리 로 특정 조권이되면 회원레벨 업 및 다운 을 시키는 쿼리를 유저가 로그인할때마다 체크해서. 로그인 한 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
주문 상태를 완료로 바꾸는 곳
amd/ shop_admin/oderformupdate.php
에서 처리 하는 것이 가장 좋아 보입니다.
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 으로 쿼리하는 방법이 일반적 입니다.
!-->