首页 > 解决方案 > 处理大型数据库时如何获得最佳性能?

问题描述

我正在编写一个浏览器游戏,其中有法术表,项目表..等。每个表都有数千行。我要处理的事情如下。

登录后,我将整个数据库存储在用户的会话中。这仅包括不会被用户输入更改的表。例如,spells 表仅包含有关法术的信息。他们造成多少伤害,玩家需要什么等级才能拥有该法术,等等。用户只读取该数据,从不写入。

假设用户想要购买特定的咒语。我无法负担 PHP 代码去检查会话变量中的每个数组的拼写 ID。而是->

    <?php
  // Load all database spells
    $stmt = $db->prepare("SELECT * FROM spells");
    $stmt->execute();
    $result = $stmt->fetchAll(\PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC);
    $_SESSION["spells_db"] = $result;
  ?>

所以,发生的事情是 -> 我将所有数据库拼写存储到这个会话变量中。使用 \PDO::FETCH_UNIQUE|\PDO::FETCH_ASSOC 我将拼写数组键更改为拼写 ID。这样我就已经知道拼写键了。

如果我需要通过 id 搜索法术信息,那么该法术的 id 也是该法术数组行的键。因此,改为使用 in_array() 让 PHP 搜索数组的每一行,以查找哪个内部数组包含相关的拼写 ID,我可以告诉它它是哪一行。这样我节省了很多性能。

但另一方面,每个单独的用户都将整个数据库存储在他的会话中。随着时间的推移,这将导致我的网站出现可扩展性问题。我知道最好将数据存储在会话中,而不是每次都进行查询以询问数据库是否有更改。就我而言,当某些事情发生变化时,首先我在会话中进行更改,然后在数据库中进行更改。并且每次用户刷新页面时,都会显示会话数据。但是谈到像存储整个数据库这样的大数据存储,让我头疼。那么,关于如何处理这个问题的任何建议?感谢您的时间。

标签: phpmysqlsessionscalability

解决方案


我建议您先使用数据库对其进行测试。我想它的MySQL。它可以快速处理表中的千兆字节数据和数百万行。重要的是索引。数千行对于 MySQL 来说并不算多(假设您没有包含多个 varchar(5000) 等的大行)。

(你说的那些键可能应该是数据库表中的索引,我有直觉认为这些是你的自动增量主键,所以它们会很快被选中。)

PHP 会话数据也必须存储在某个地方

  • 如果您将会话存储保留为默认值,则数据将存储在磁盘上的文件中。这意味着磁盘写入和那些比任何现代数据库(甚至在 SSD 上)都慢,因为数据库会缓存(到 RAM)和优化。
  • 如果您将会话存储在 RAM 中并且确实有大量数据,那么您肯定会用完 RAM。
  • 如果您将会话存储在数据库中...您知道

推荐阅读