优化ajax以减少mysql服务器负载

3
我有一个拍卖网站,有时会负载过重,主要是mysql占用了大量的内存和CPU。我的情况如下。
每秒钟,一个ajax查询会去mysql查询每个在线用户观看的拍卖品的出价次数,以检查是否与上一次不同。如果有人出价,计数就变了,所以这个ajax会调用另一个ajax,检索记录,并在表中显示特定于正在观看/登录的用户的竞标。我将其限制为前10条以减少负载。
然而问题在于,如果有50个用户在线,其中一个人出价,那么就会有50个查询进入mysql,并且全部都会检测到出价次数已更改,并发出其他查询以获取记录,以显示对应于每个用户的竞标。
更大的问题是,如果有500个用户在线,则会有500个查询进入mysql以检测更改,如果出价,另外500个查询(针对每个在线用户的查询)进入mysql,并可能导致服务器崩溃。
注意:目前在PHP中使用了一个单例作为单个mysql连接对象,负责执行查询、检索记录等。
我实际上正在寻找一种解决方案,在500个用户在线时不需要进行500个mysql查询,但所有用户都应该得到更新,即使其中一个人为特定拍卖品出价。任何想法/建议都非常受欢迎。
我如何最好地实现这种情况下减轻mysql负载的解决方案?
资源方面,我们相当不错,在Hostgator上进行VPS4。唯一的问题是CPU/内存使用率,在许多用户竞价时达到了95%。
感谢您提供的建议。

如果您有一个长时间运行的进程,那么它可以每秒钟查找并缓存该值,这样您就不必返回到MySQL。但我不知道如何在PHP中实现这一点。 - Brendan Long
2个回答

0

看起来你需要查看memcached或其他缓存服务。您可以有一个进程查询MySQL并将其更新到memcached中,然后ajax直接查询memcached以检索行。

Memcached不保持关系一致性,并且查询它比每次查询MySQL消耗的资源要少得多。

PHP具有与memcached一起使用的非常好的接口:Memcache

memcached项目的网站。

还有一些其他缓存服务。您可能还想查看MySQL中的查询缓存,但这仍然需要多个连接到MySQL,无论哪种方式都会非常消耗资源。


你好。做这个memcache非常棘手,因为查询数据库的过程可以每秒执行一次,但在1秒钟内我们期望有50-60个竞拍出价。这意味着缓存的数据已经不同步,尽管只有一秒钟的时间差。因此,ajax查询memcache很可能会得到错误/不同步的信息。 - Anita
AJAX也不能完全带来最新的结果。需要与服务器进行几次往返以检索所有信息。您还可以查看轻量级连接到MySQL,或在多个MySQL实例上分配负载。 - Pablo

0

短期内,您也可以运行详细查询。当没有更新内容时,它将返回空值(这将替换第一个查询!)。

这可能为您提供一些时间来缓存或更深入地分析查询速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接