我有一张地图,
有数百个动作监听器(每个位置对应一个地图),当用户点击地图的一个单元格/磁贴时,他会获得有关该单元格的更多信息(信息显示在同一页面中)。
我想在MySQL数据库中存储单击单元格的次数。
问题在于我想让用户快速点击并获取信息( - >用户经常点击),并且每次点击都会降低性能。 此外,有大量用户对每次点击进行查询,并且每个用户都有大量点击,这将填满我的数据库带宽。
所以我希望在客户端上有一个存储点击的“缓冲区”,并将它们异步更新/插入到我的数据库中(例如,当用户离开页面时进行查询,经过几次点击后,在完成秒后, ......) 我知道我可以用JS做到这一点,但它对我来说似乎很难看,不是吗? 你会怎么做? (代码表示赞赏,但不是强制性的)
要点: 我想避免在点击时进行查询,我想在一组点击之后进行查询(减少查询次数)并且不会丢失点击次数。
答案 0 :(得分:1)
每次点击都必须转到某个中央服务器进行处理。 JavaScript - > AJAX - > PHP(或其他cgi)是明显的(也是唯一的?)答案。
因此,您需要查看另一个性能问题。 cgi可以处理每秒多少次点击?限制与MySQL可以处理的计数器UPDATEs
的数量具有相同的数量级。
如果您需要每秒处理数千次点击,则需要拥有多个Web服务器。这会使事情变得更复杂。我将在本次讨论中假设所有处理都可以在一台服务器上完成。
那么,让我们看看另一种可能的解决方案。 PHP可以访问某种形式的“共享”内存吗?如果是这样,所有连接都可以阻止 内存中的计数器而不是某些MySQL表。需要某种形式的锁定以防止丢失计数。看看那个。
好吧,假设您确定需要将更新保留在数据库中。使用InnoDB。如果事务比单个SQL语句更复杂,则使用事务,并处理死锁。
我认为MySQL不是限制因素。你有相反的“证据”吗?如果是这样,让我们看一下所涉及的SQL,加上SHOW CREATE TABLE
。
另请参阅Redis。