【问题标题】:Is it faster to allow PHP to parse a large file than calling data from a MySQL database?允许 PHP 解析大文件是否比从 MySQL 数据库调用数据更快?
【发布时间】:2011-05-03 13:11:28
【问题描述】:

所以。我有一个数据表,在 MySQL 数据库中,例如:

  • 艺人姓名
  • 艺术家传记
  • 艺术家时代

比如说:100 位艺术家。

因为这些数据很少会被修改,所以我创建了一个界面,当数据被管理员修改使用内容管理系统时,系统查询数据库,并保存一个序列化的PHP数据数组作为服务器上的文件。

每次添加新艺术家时都会重新创建此文件,例如每周一次。

在前端,当页面加载而不是查询数据库时,页面只包含 文件(使用输出缓冲)并从此对象生成 HTML 页面布局。

这是个好主意吗?这会比每次加载页面时让数百名用户查询数据库更快吗?

作为这个问题的扩展,如果我开始分页数据,例如将 MYSQL 结果对象的限制设置为 10 行,将整个表作为 PHP 数组访问并将其分成 10 个组会更慢吗 - 根据查询字符串回显相关部分?

【问题讨论】:

  • 只要你生成的平面文件不涉及运行几行PHP,它比查询数据库要快。 甚至更快 是创建一个 HTML 文件,您无需加载 PHP 解析器即可将其服务器化。不过,就速度而言,要记住一件事:加载页面所花费的时间有 80% 是在客户端。确保您的 javascript 和 CSS 已经过优化,并避免显示未压缩的图像。
  • 您是否尝试过使用 Apache Bench 对各种方法进行速度测试?我建议以两种方式进行设置并对其进行测试。可能没有足够大的差异来担心。如果您之前没有使用过ab,请参阅petefreitag.com/item/689.cfm
  • 每次有人想要存储序列化的东西时,更重要的问题是:为什么不使用var_export?与序列化相比,它节省了很多开销。在那次切换之后,人们仍然可以争论 SQL / var_export 的优点,如果你只需要子集 SQL / 一个数据库可能会更快,如果你一直需要一个由var_export创建的静态 PHP 数据结构@ 可以赢。
  • PHP 序列化的另一种替代方法是 json_encode。
  • @Wrikken 非常好。我忽略了他可能只想要静态数据的子集,在这种情况下尝试读取和解释文件总是比数据库慢(更不用说文件系统的开销)。

标签: php mysql arrays performance serialization


【解决方案1】:

我认为您想缓存这些文件,而不是制作要读取的文件。

如果更新频率低,你可以添加一个例程来重新生成静态文件,每个页面一个,比如说artist-1.html(最后10个插入),artist-2.html(下10个)...

查询是有代价的。过滤文件内容不一定比查询数据库快(数据多,效率低)。

另外要提的是,100 行对于数据库来说几乎没有任何意义。真的。如果它是 10,000+,您可能会开始担心性能。 100 行对于任何现代数据库来说都是小菜一碟。

正如我所说,您可以为每次更新“编译”这些静态文件,因此只需几秒钟或更短的时间即可完成该数量,并提供直接访问的优势,这是检索信息的最快方式(这里不讨论内存,因为内存更快,但需要更复杂的解决方案。

【讨论】:

    【解决方案2】:

    我不能给你一个 PHP 特定的答案,但我建议不要序列化数据,因为数据库旨在很好地处理大量数据。我建议您将数据存储在数据库中,因为您以后可能希望将其用于其他事情,例如生成需要聚合数据的报告。如果没有 mysql 之类的数据库引擎,这样的练习将是令人望而却步的。

    最后,关于性能说明 IIS 缓存了 html 输出,我认为 apache 也可以,虽然我不是 100% 的。

    【讨论】:

      【解决方案3】:

      系统查询数据库,并保存 数据的序列化 PHP 数组为 服务器上的文件。

      如果您要这样做,您应该走完整个九码并缓存生成的 HTML 并让您的页面包含它。这样可以避免包含可执行代码、遍历数组和每次都创建 HTML。

      您甚至可以使用此方法缓存分页的 HTML。

      关于文件方法的可扩展性,包括在每次请求时将序列化数组放入内存,其效率远低于从文件增量加载数据库的效率,因为前一种方法的所有内存使用会降低整个服务器的速度。

      【讨论】:

        【解决方案4】:

        这种速度改进可能很诱人,但我认为创建和解析 PHP 文件的努力不值得,它甚至可能比简单的数据库查询要慢。此外,您也放弃了很多灵活性(您必须实现您想要对数据进行的任何类型的查询)。减少数据库负载的常用方法是使用缓存系统,如Memcached。但是当速度真的成为一个问题时,您不是在谈论数百个用户,而是在数以万计的规模上,所以在没有必要之前不要在那里进行优化。

        【讨论】:

          【解决方案5】:

          当您只谈论 100 条记录时,我认为这两种方式都没有太大区别。实际上,您所做的只是缓存一个 MySql 查询。如果您希望它更快,您可以使用 APC 将查询缓存在内存中。更快的方法是将每页结果缓存到内存中的单独对象中。

          【讨论】:

            【解决方案6】:

            它可能会更慢。将其存储在文件系统上将需要对 full 文件进行反序列化,即使您只需要一小部分数据。

            永远不要忘记:数据库快速!如果他们不是你错过了一个索引;)

            PS:如果您想提高性能(并且仅在您确实需要时才这样做!)请使用 APC 甚至更好地缓存完全生成的页面,因此它可能会以几乎静态的方式提供。

            【讨论】:

              【解决方案7】:

              我不确定文件解析和 mysql 查询执行的速度差异。由于在管理员更改列表之前您的内容有些静态,因此您可以创建 HTML 页面布局并将其存储为可供用户使用的 html 文件。它肯定会减少服务器负载,因为页面不需要任何类型的解析或 sql 查询执行。

              如果您使用分页,则不需要从 mysql 加载完整结果,您可以使用 LIMIT 关键字限制从 mysql 表中获取的结果。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-10-21
                • 2012-08-01
                • 2013-04-11
                • 1970-01-01
                • 2014-08-17
                • 1970-01-01
                • 2011-01-10
                • 1970-01-01
                相关资源
                最近更新 更多