2012-11-08 25 views
0

如果您擁有一百萬個遊戲用戶羣,但只希望一次登錄一個用戶羣,那麼最好如何組織結構,以便您可以在您的網站上顯示活躍用戶的數量?你不會想(我認爲)做一個天真的SELECT count(*) FROM users WHERE logged_in = 1如何有效地追蹤大型用戶羣中登錄用戶的數量

+0

你知道,這很棘手。對於突然斷開連接的用戶,查詢數據庫將失敗。這應該在應用程序級別完成,您不會對我們一無所知 –

+0

您使用的是哪個數據庫?例如,使用SQL Server,你可以使用帶有過濾索引的位標誌。 – RedFilter

+0

@Adrian通過數據庫傳遞數據是一種非常正常的範例,無論是我們發現自己的用例,因此您必須在這些約束下工作:) –

回答

0

兩件事情。首先,在logged_in列上放置索引。第二,我假定這只是一個錯字(缺少選擇列),如果你需要的是一個數,這是你的查詢:

select count(*) from users were logged_in = 1 

可以保持一個單獨的統計數據表來跟蹤您想要快速訪問的任意數量的聚合。這並不是一個壞主意。但是,添加一個索引應該保持這個特定的查詢很快。一旦您開始需要定期報告其他聚合用戶統計信息,請爲此創建一個統計信息表。

請記住,統計資料表往往是非常簡單的,如果/當你走這條路線:

stat_id : int 
name : varchar 
int_value : int 
float_value : float 

然後,每次登錄時只需...

update stats set int_value += 1 where name = 'logged_in_users'; 

而且每註銷需要...

update stats set int_value -= 1 where name = 'logged_in_users'; 

而且可能會自動登錄用戶並定期「重建」統計表。

+0

如果用戶突然斷開,該怎麼辦?電源浪涌,互聯網連接斷開等等。並非所有的斷開都是優雅的,這應該在應用程序級而不是數據庫中進行處理。 –

+0

一般來說,索引標誌列由於基數較低而沒有用處。 – RedFilter

+0

98%肯定它在這種情況下不是無用的。 – svidgen

1

我會保持一個logins表,添加到這張表,無論何時用戶登錄和當用戶註銷,刪除條目。 該表還可以有到期時間,讓你可以考慮登錄超時和查詢功能:

SELECT COUNT(*) FROM dbo.Logins WHERE LoginExpiry < GETDATE() 
+0

如果用戶突然斷開連接,該怎麼辦?電源浪涌,互聯網連接斷開等等。並非所有的斷開都是優雅的,這應該在應用程序級而不是數據庫中進行處理。 –

+0

取決於你如何處理用戶?你可以添加更多的細節? – bendataclear

+0

有一些細節需要考慮。我們甚至不知道op的應用程序平臺(php?ror?android?ios?windows?)。我只是認爲你的回答低估了這個問題的複雜性。 –