최상위 포인트 소지자 x명을 부하없이 구할 수 있을까요?

최상위 포인트 소지자 x명을 부하없이 구할 수 있을까요?

QA

최상위 포인트 소지자 x명을 부하없이 구할 수 있을까요?

본문

안녕하세요

 

x 포인트 이상 및 최상위 포인트 소지자 x명에 포함될 경우 특정 레벨 아이콘을 부여하고 싶은데

혹시 최상위 포인트 소지자 x명을 부하없이 구하는 방법이 있을까요?

 

단순히 

select * from g5_member order by mb_point desc limit x

이런 식으로 하면 레벨을 보여줄 때 마다 부하가 심할텐데..

 

그렇다고 해서 캐시를 해놓기 위한 테이블을 만든다면 또 실시간으로 변경이 되기 어려운 점이 있는데

 

좋은 방법이 있을까요..!

이 질문에 댓글 쓰기 :

답변 4

페이지 이동마다 이런 쿼리를 실행해야하고 모든 접속자가 실행해야 하니

회원이 계속 늘어나면 바람직하지않은 상황이 될테죠

이렇게 하면 어떨까요?

1. 10명이 필요하다면 20위 정도를 추출해서 config_table 여분필드 cf_1 에 아이디를 기록합니다

-- 이 작업은 하루에 한번만 하도록 구성

--config_table은 페이지 이동시마다 항상 읽어오도록 되어있으므로 따로 쿼리를 하지않아도 됨

 

2. 포인트 추가가 발생하면 이 회원이 위 20위 중에 해당하는지 판별해서 20위 내에 있는 회원이면

   새로이 20명을 추출해서 cf_1을 갱신 합니다

 

3. $config[cf_1]의 값으로 필요한 처리

 

 

오오..!
답변 감사합니다.

매번 읽어오는 걸 이용하면 굳이 테이블을 만들지 않아도 되는군요!

설명해주신 내용 중에서 2번 내용이 헷갈리는데..

포인트 추가가 발생한다는 건 cf_1에 기록된 아이디 중에서 포인트 변동을 의미하는 걸까요?

그리고 쿼리 부하를 방지하기 위해 하루에 한 번 cf_1에 아이디를 기록하는데
2번 기준에 의해 갱신을 해야한다면 하루에 한 번 하는 쿼리문 부하가 계속해서 발생되는 상황이 되지 않을지 ..ㅠ

제 허접잖은 궁금증인데..
혹시 가능하시면 답변 부탁드리겠습니다..!

2번 기준에 의해 갱신을 해야한다면 하루에 한 번 하는 쿼리문 부하가 계속해서 발생되는 상황이 되지 않을지 ..ㅠ <---20위 내에 들어가는 회원인지 포인트 등록할때(insert_point 함수) 판별해서
해당되면 cf_1을 갱신하는 것이니 계속부하가 발생할 까닭이 없을 것입니다

하루에 한번 작동되도록 하는 방법은 cf_2에 cf_1 이 갱신될때 갱신날짜를 기록하고
cf_2가 오늘 날짜가 아닐경우만 1번을  실행하도록 해두면
위의 조건처럼 포인트 변경이 있을 경우만 순위 쿼리를 다시해서 cf_1을 갱신하는 것이니
20위내에 속하는 회원이 하루종일 포인트추가하는 작업을 하고 있다손 치더라도 전혀 문제될 것이 없을 겁니다

SELECT * 
FROM `g5_member` 
ORDER BY `g5_member`.`mb_point` DESC 
LIMIT 0 , 3 

회원수가 얼마나 되는지 몰라도 저정도면 부하가 심하진 않을 것 같은데요 

그.. 제가 고민되는게 당장은 문제가 안되도 나중에는 위에 쿼리문으로는 분명 문제가 될 것 같아서.. 뭔가 구조상 해결을 해보았으면 해서요 ㅠ
혹시 방법이 없을까요..!

답변을 작성하시기 전에 로그인 해주세요.
전체 2

회원로그인

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