【问题标题】:in PHP, which is faster - reading a file or a database call?在 PHP 中,哪个更快 - 读取文件或数据库调用?
【发布时间】:2010-10-06 22:17:17
【问题描述】:

我在 LAMP 堆栈上使用 Zend 用 PHP 构建了一个 Web 应用程序。我有一个需要加载到内存中的 4000 个单词的列表。单词有类别和其他属性,我每次都需要加载整个集合。想想一个字典对象。

为了快速调用而存储它的最佳方式是什么?包含 XML、JSON 或序列化对象之类的平面文件?包含大量 XML、JSON 或序列化对象的数据库记录?还是一个数据库表中有 4000 条记录?

我意识到不同的服务器配置会有所不同,但假设一个开箱即用的共享托管计划,或本地 WAMP 或其他一些简单的设置。

【问题讨论】:

  • @deceze - 我做到了 - 你可以在我的回复中看到结果

标签: php database performance optimization file-io


【解决方案1】:

如果您使用的是 APC(或类似的),您最快的结果可能是将单词列表直接编码到 PHP 源文件中,然后只需 require_once()'ing 它。

【讨论】:

  • 如果我将它放在一个 json 文件中并将 json 文件解码为一个数组,这仍然会从 APC 中受益吗?还是这种方法会慢很多?
【解决方案2】:

在理想的系统中,我会说内存(memcached)、磁盘和数据库。但是根据设置,数据库可能比磁盘快好几次,因为结果可能会保留在查询缓存中。

这一切都取决于环境;如果它那么关键,你应该测量它。否则将其放置在您认为更容易访问的地方。

【讨论】:

  • “如果它那么关键,你应该测量它。” - 我完全同意
  • 很好的建议,我也相信测量是最好的选择,在我的情况下,数据库得到了更好的结果,所以我会坚持使用数据库而不是文件系统。
【解决方案3】:

我会将它放在一个可以缓存的文件中,从而为您在每次(或者甚至可能是每次?)页面加载时节省大量不必要的数据库调用。你如何存储它并不重要,什么最适合你。速度方面,4000 字完全不成问题。

对于我从事的项目中的翻译,我总是使用包含序列化 php-data 的语言文件,这很容易检索:

$text = unserialize(file_get_contents('/language/en.phpdata'));

【讨论】:

  • 我时常这样做,我使用数据库作为原始数据库并运行一个 cron Job 来更新文件。只是缓存文件。它可以节省很多资源。基本上,如果它等于文件日期,则查询数据库中的最后更新日期使用该文件。如果需要,可以创建一个会话或 cookie 以始终引用该文件,但它可以轻松地为大型项目节省 1 秒的查询时间。它并不适用于每个项目,但有时它很有用。
【解决方案4】:

将列表格式化为 PHP 源并包含它。

如果做不到这一点,请问问自己,加载速度是否真的很重要。 4000字也不算多。

【讨论】:

    【解决方案5】:

    如果您一直需要内存中的所有 4000 个,这将违背查询数据库的目的,尽管我可能是错的。序列化对象听起来很简单,我认为它在这么多的单词上表现还不错。

    【讨论】:

      【解决方案6】:

      如果您能够使用 memcached,则使用上述任何方法创建一次数组,将其发送到 memcached,然后从那里重新使用它可能是最快的。以Can you store a PHP Array in Memcache 的答案为例。基本上它看起来像这样:

      $cache = new Memcache;
      $cache->connect('localhost', 11211) or die ("Could not connect");
      $cache->set('words', $myarray);
      

      并得到它:

      $myarray = $cache->get('words');
      

      【讨论】:

        【解决方案7】:

        如果您仍然要将单词列表序列化为 XML/JSON,那么只需使用一个文件。我认为更自然的方法是将列表包含在 PHP 源代码中。

        如果该列表要更改,您将拥有更多的数据库灵活性。

        【讨论】:

          【解决方案8】:

          如果您只想知道哪个更快,我会选择 DB。除了速度之外,使用 DB 更安全、更易于使用。但是,请注意使用正确的数据类型,例如 ntext (MS-SQL 服务器) 或 BLOB (oracle)。

          【讨论】:

          • 这有什么证据支持?
          【解决方案9】:

          我遇到了类似的问题并对其进行了一些测试。 以下是 25 000 次循环的时间安排:

          从 DB 中读取一个长文本:9.03s 读取一个文件:6.26s 包含 php 文件,其中包含文本的变量:12.08s

          也许最快的方法是使用任何这些选项读取这些数据(一次,重新启动服务器后)并创建存储在内存中的数据库(存储引擎:内存),但它可能有点复杂,所以我会更喜欢“从文件中读取”选项。

          【讨论】:

            猜你喜欢
            • 2023-03-17
            • 2011-09-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多