2015-05-07 62 views
0

我有一個地圖, 數以百計的動作偵聽器(一個用於地圖的每個位置),當在一個小區內的用戶點擊/地圖的瓷磚,他獲得了更多的有關此單元格的信息(信息顯示在同一頁面中)。
我想在一個MySQL數據庫中存儲一個單元格被點擊的次數。的MySQL查詢減少數量的onclick - 異步更新

的問題是,我希望讓用戶快速點擊獲取信息( - >用戶會點擊常),和每一個他單擊減慢演出時間做一個查詢。 此外,擁有大量用戶爲每次點擊進行查詢以及爲每個用戶進行大量點擊都會填充我的數據庫帶寬。

所以我想在客戶端上有一個存儲點擊的「緩衝區」,並將它們更新/插入到我的數據庫中異步(例如,在用戶離開頁面,點擊幾次後, ,...)。 我知道我可以用JS做它,但它對我來說似乎很醜,不是嗎? 你會怎麼做? (代碼表示讚賞,但不是強制性的)

摘要: 我想避免對點擊進行查詢,我希望在一組點擊(減少查詢次數)之後執行查詢並且不會丟失點擊。

+0

你可以使用[後臺作業(http://kamisama.me/2012/10/09/background-jobs-with-php-and-resque-part-1-introduction/)積累的點擊和然後將它們存儲在數據庫中。 – axxis

回答

1

每次點擊都必須去一些中央服務器進行處理。 JavaScript - > AJAX - > PHP(或其他cgi)是顯而易見的(也是唯一的)答案。

所以,你需要看看其他性能問題。 cgi每秒可以處理多少次點擊?這個限制與MySQL可以處理的計數器數量UPDATEs的數量級相同。

如果您需要處理每秒上千次的點擊,你將需要有多個Web服務器。這會使事情變得更加複雜。我將假設所有的處理都可以在一臺服務器上完成。

那麼,讓我們看看另一種可能的解決方案。 PHP可以訪問某種形式的「共享」內存嗎?如果是這樣,所有的連接都可以通過這個存儲器而不是某個MySQL表中的碰撞計數器。需要採取某種形式的鎖定以防止丟失計數。研究一下。

OK,假設你決定你真的需要保留在數據庫中更新。使用InnoDB。如果事務比單個SQL語句更復雜,則使用事務並處理死鎖。

我認爲MySQL不是限制因素。你有相反的證據嗎?如果是這樣,讓我們​​看看涉及的SQL,再加上SHOW CREATE TABLE

也看看Redis。