2013-01-16 3 views
0

온라인 게임의 서버 측 부분을 개발 중이며 작업 중 하나는 사용자 순위를 계산하는 것입니다. 현재는 RDBMS를 사용하여 완료되었지만 일부 플레이어가 게임에 이길 때마다 각 사용자 행을 업데이트합니다. 평균 20 명의 플레이어가 온라인 상태 일 때 교착 상태가 발생합니다.사용자 순위 : SQL없이 어떻게 할 것인가?

저는 1000 명의 플레이어가있을 때 데이터베이스 솔루션이 전혀 작동하지 않는다는 것을 이해합니다.

Apache/PHP 서버에서 실시간으로 사용자 등급을 계산하는 방법은 무엇입니까? 거기에 더 똑똑한 데이터베이스 솔루션?

+0

교착 상태가 20 명입니까? 당신이 Access를 사용하고있는 것 같네요. Y/N? – Sammitch

+0

전혀 아닙니다. MySQL을 사용하고 있지만 여러 사용자가 동시에 데이터베이스에 액세스 할 때 사용자 순위 업데이트가 중복 될 수 있습니다. 교착 상태의 원인은 무엇입니까. –

답변

2

당신은 TRUNCATE 때마다 다른 테이블에 순위를 넣을 수 있습니다. 유사한 질문이 이미 제기되어 (답변 됨) 여기에서 찾을 수 있습니다. Best way to update user rankings without killing the server

+0

위대한 솔루션, 고마워. 하지만 RDBMS를 전혀 사용하지 않는 솔루션이 있다면 궁금합니다. 작업은 균형 잡힌 BST를 사용하여 쉽게 해결됩니다. 아마도 Apache/PHP에 대한 준비가 되었습니까? –

+0

이러한 승인을 구현했지만 이제는 많은 중복 키 오류가 생성됩니다. 것은 여러 사용자가 쿼리 중복을 초래할 수있는 동시에 순위 업데이트를 실행할 수 있다는 것입니다. 솔루션이 문제를 다른 것으로 변환하는 것처럼 보이지만 해결하지는 못합니다. –

+0

Sammich의 접근 방법은 어떻습니까? –

1

왜 순위를 별도의 테이블에 저장합니까? 필요에 따라 점수를 저장하고 순위를 쿼리하거나보기를 만듭니다. 전체 테이블을 업데이트하는 것이 아니라 단일 사용자와 관련된 데이터 만 업데이트하면됩니다. InnoDB 테이블을 사용하는 경우 UPDATE 쿼리는 myISAM으로 얻는 테이블 수준 잠금 대신 행 수준 잠금을 사용합니다.

TABLE users 
    user_id INT PK 
    user_name VARCHAR 
    ... 

TABLE user_scores 
    user_id PK FK 
    score INT INDEX 
    wins INT INDEX 

VIEW v_user_ranks 
    SELECT u.user_id, u.user_name, s.score, s.wins 
    FROM users u INNER JOIN user_scores s 
    ON u.user_id = s.user_id 

SELECT * 
FROM v_user_ranks 
ORDER BY score, wins DESC 
LIMIT 10 

INSERT INTO user_scores (user_id, score, wins) 
    VALUES ($id, $score, $wins) 
    ON DUPLICATE KEY UPDATE score=score+$score, wins=wins+$wins 
+0

문제는 내가 사용자 순위를 매우 빨리 검색 할 수 있어야한다는 것입니다 (사용자에게 이전/새 순위를 알리고 게임에 이길 때 변경). 순위에 따라 정렬 된 사용자 등급 테이블을 표시 할 수도 있지만 일부는 정렬 할 수 있습니다. 다른 카테고리 (예 : 알파벳순). 그래서 내가 바뀔 때마다 사용자 등급을 실현해야합니다. –

+0

귀하의 방식은 사용자가 게임에서 이기고 특정 방식으로 정렬 된 X 행을 선택할 때마다 * 전체 테이블 *을 업데이트하는 것입니다. 내 방식은 * 단일 행 *을 업데이트 한 다음 특정 순서로 X 행을 선택합니다. 어느 것이 더 빠르게 들리니? 또한 전체 테이블을 포함하는 연산을 수행 할 때 너무 자주 테이블 레벨 교착 상태를 해결할 수는 없습니다. – Sammitch

+0

당신의 방법을 아직 이해하지 못했습니다. 미안합니다. (점수는 무엇이며 승리는 무엇입니까?) 사용자 순위는 어디입니까? –

관련 문제