如何避免mysql查询每个页面加载RPG游戏?有任何想法吗?

时间:2009-12-31 11:47:11

标签: php mysql

我最近一直在做RPG游戏,每个页面加载我都要使用mysql_query(这个查询相当大,需要一些带内连接的表)来获取有关玩家的信息。 我有时可以避免这种查询吗?当然,我可以每隔30秒使用缓存和查询,但它不会立即更新新信息。那么,有什么想法吗?

8 个答案:

答案 0 :(得分:4)

如果信息量有限并且特定于您的播放器,则可以将其放入$_SESSION

答案 1 :(得分:2)

我认为你应该使用Memcache

答案 2 :(得分:2)

如果您需要新的新信息,则无法避免进行查询。

您可以创建智能缓存,在创建新条目时删除缓存,或者您需要从数据库获取新信息的任何其他时间。

Frameworks现在为你做了很多工作,CakePHP擅长于此。

答案 3 :(得分:2)

要知道在没有再次进行查询的情况下是否有任何更改,有两个选项:

(1)如果有任何改变,则刷新缓存,或

(2)保留最后修改的或其他一些在数据更改时发生变化的小值,并将其与缓存值保持一致,以查看它是否仍然是最新的。

选项(1)要求您知道代码中玩家信息更新的所有点。如果您需要组合多个表,则选项(2)也很困难,您需要计算您将使用的每个记录的最后修改时间的最大值。

在任何情况下,良好的缓存都是一个难题,您需要平衡管理缓存所需的时间与不必执行查询所节省的时间。并且还考虑使用陈旧(即过时)信息的惩罚,通常(特别是在游戏中)使用过时几秒钟的信息并不是那么重要。

答案 4 :(得分:1)

首先,您应该深入了解您正在使用的数据,您可能并不真正需要从每个页面上的数据库中提取所有数据。根据您在特定方案中需要哪些数据,您可以通过以下方式显着加快检索速度:

  • 将非敏感数据存储在Cookie中以便快速检索(只要您验证数据以防止篡改)

  • 使用memcache作为Safraz指出

  • 使用$ _SESSION superglobal

  • 如果需要,将数据库非规范化以保存重连接

  • 仅选择特定页面确实需要的数据,并根据需要选择其他数据。

结合使用这些技术,您应该能够显着减轻数据库的压力,并为用户提供更快,响应更快的应用程序。

答案 5 :(得分:1)

读取与写入的比率是多少?如果你有更多的读取而不是写入,那么显而易见的答案是坐在数据库前面的写入缓存。如何实现这将取决于您想要扩展的大小(即多少并发播放器)以及您是否需要高可用性(即分布在多个物理机器上的缓存)。

答案 6 :(得分:1)

如果您正在使用PHP会话(最好是),那么将SQL结果放在会话中并在页面加载时检查数组是否存在于会话中,如果是,请使用它,如果不存在,则运行查询。

让我们说:

if ( !is_array($_SESSION['player_data']) )
{
    // the data isn't cached, query the database here and put it in $_SESSION['player_data']
}

答案 7 :(得分:0)

尝试对数据库进行非规范化。

如果您正在使用内部联接,请将所有数据放在一个表中。 (内部联接的结果数据) 在用户编辑其值时保留其他表,但是对于阅读,请使用所有数据所在的表。

这会提高速度,因为没有内部连接,你仍然需要查询数据库,但如果你真的不想,我能看到的唯一解决方案是使用memcache,sessions或者某种缓存文件