최상위 포인트 소지자 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_2에 cf_1 이 갱신될때 갱신날짜를 기록하고
cf_2가 오늘 날짜가 아닐경우만 1번을 실행하도록 해두면
위의 조건처럼 포인트 변경이 있을 경우만 순위 쿼리를 다시해서 cf_1을 갱신하는 것이니
20위내에 속하는 회원이 하루종일 포인트추가하는 작업을 하고 있다손 치더라도 전혀 문제될 것이 없을 겁니다
댓글을 작성하려면 로그인이 필요합니다.
답변에 대한 댓글 1개
혹시 방법이 없을까요..!
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인
답변 감사합니다.
매번 읽어오는 걸 이용하면 굳이 테이블을 만들지 않아도 되는군요!
설명해주신 내용 중에서 2번 내용이 헷갈리는데..
포인트 추가가 발생한다는 건 cf_1에 기록된 아이디 중에서 포인트 변동을 의미하는 걸까요?
그리고 쿼리 부하를 방지하기 위해 하루에 한 번 cf_1에 아이디를 기록하는데
2번 기준에 의해 갱신을 해야한다면 하루에 한 번 하는 쿼리문 부하가 계속해서 발생되는 상황이 되지 않을지 ..ㅠ
제 허접잖은 궁금증인데..
혹시 가능하시면 답변 부탁드리겠습니다..!