【问题标题】:Speed of data manipulation in PHP vs MySQLPHP 与 MySQL 中的数据操作速度
【发布时间】:2011-01-07 18:01:31
【问题描述】:

如果这是一个愚蠢的问题,请提前道歉,但我想知道在以下简化方案中哪个可能更快/更好......

我有注册用户(在用户表中)和国家(在国家表中)大致如下:

用户表: user_id (PK, INT) | country_id (FK, TINYINT) |其他与用户相关的字段...

国家/地区表: country_id (PK, TINYINT) |国家名称 (VARCHAR) |其他国家相关领域...

现在,每次我需要显示用户所在的国家/地区时,我都需要进行 MySQL 连接。然而,我经常需要对用户做很多其他的连接,而且总体上看起来很“重连接”。

我想知道将国家从数据库中取出并将它们作为数组放入一个类中的优点和缺点是什么,我可以使用 country_id 通过公共方法调用轻松地从中检索它们?会有速度优势/劣势吗?

非常感谢。

编辑:感谢所有意见,非常有用。尽管所有贡献都受到重视,但我会选择第一个答案作为公认的解决方案。

【问题讨论】:

  • 您的意思是在 PHP 文件而不是数据库中写入国家/地区?
  • 是的,在 php 文件中而不是在数据库中。

标签: php mysql class arrays methods


【解决方案1】:

您现在有严重的性能问题吗?我最近在为我的公司开发的一个 php/mysql 网站上进行了性能改进。某些区域太慢了,结果发现很多问题都出在查询本身上。我使用计时器来确定哪些查询很慢,并重新组织了它们(添加了索引等)。在某些情况下,进行两个单独的查询并将它们连接到 php 中会更快(我有一些非常复杂的连接)。

在您知道自己有问题之前不要尝试优化。首先通过测量确定您是否有问题,然后如果您需要重新排列查询,您将能够知道您是否进行了改进。

【讨论】:

  • 当然....现在我正在寻找一个尚未实施的新解决方案,但看起来还有很多其他的东西将基于它,所以我宁愿构建它朝着正确的方向前进,以后不必从根本上重新设计。
  • 啊,这样的话,我的感觉是放在mysql里会更快。对于您想要进行外部连接的国家/地区列表或查询中的国家/地区表的任何真正奇怪的事情,这不太可能。您可能只想加入国家 ID 或从数据库中提取国家列表。前者可以进行非常快速的查询,而后者可以通过缓存加速。
【解决方案2】:

减少 JOIN 语句会减轻 MySQL 服务器的压力,但效果并不明显(世界上没有那么多国家)。但是,您将不得不在 PHP 中自己实现 JOIN,从而弥补那段时间。而且由于您是自己编写的,因此编写它的效率可能会低于 SQL 语句,这意味着它会花费更多时间。我建议将其保留在 SQL 服务器中,因为将其移出的好处很少(如果 PHP 实例和 MySQL 实例在同一个盒子上,则没有真正的优势)。

【讨论】:

    【解决方案3】:

    您的建议应该更快。诚然,连接可能不会花费太多,但就计算能力而言,在字典中查找它应该几乎是免费的。

    这实际上只是以内存换取速度。我能看到的唯一缺点当然是存储国家信息的内存使用量增加,而且如果你更新国家表(这可能不经常),你将不得不使缓存无效。

    【讨论】:

      【解决方案4】:

      我认为您不会从删除联接中获得任何好处,因为您必须遍历所有结果行并手动查找国家/地区名称,我怀疑这会比 MySQL 更快。

      我也不会考虑这种方法,原因如下:如果您想更改一个国家/地区的名称(假设您有错字),您只需更新数据库中的一行即可。但是,如果国家/地区的名称在您的 PHP 代码中,则必须重新部署代码才能进行更改。我不了解 PHP,但这可能不如生产系统中的数据库更改那么简单。

      因此,出于可维护性的原因,恕我直言,让数据库来完成这项工作。

      【讨论】:

        【解决方案5】:

        数据库世界的一般规则是先进行标准化(导致更多表),然后再计算性能问题。

        您只需要为了简化代码而不是为了性能而进行 DENORMALIZED。使用索引和存储过程。 DBMS 旨在优化连接。

        没有“随手规范化”的原因是每次修改数据库设计时都必须修改已经编写的代码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-28
          • 1970-01-01
          • 1970-01-01
          • 2012-02-10
          相关资源
          最近更新 更多