【问题标题】:Are include()s faster or database queries?include()s 更快还是数据库查询?
【发布时间】:2009-07-25 22:08:09
【问题描述】:

客户坚持我们将一些重要且复杂的配置数据存储为 php 数组,而我希望将其存储在数据库中。他提出了效率/优化的问题,说文件 i/o 将比数据库查询快得多。我很确定我在某处听说文件包含在 PHP 中实际上很慢。

关于此的任何统计数据/真实信息?

【问题讨论】:

标签: php file-io


【解决方案1】:

根据您的具体情况,会有很大差异。

如果数据库存储在内存中和/或您要查找的数据被缓存,那么数据库 I/O 应该非常快。但是,如果没有缓存或必须转到磁盘,对大型数据库进行非常复杂的查询可能会花费相当多的时间。

文件 I/O 必须从磁盘读取,这很慢,但也有智能缓存机制可以将经常访问的文件保存在内存中。

在您的实际系统上进行分析将是最权威的。

【讨论】:

  • 将被拉取的数据将是 30-50 行,而不是复杂的查询,只是一个 select * from。在这种情况下有什么想法吗?
  • 对于分析建议 +1。有很多变量——数据库在内存中吗?你使用像 APC 这样的字节码缓存吗?数据库是本地的吗?
【解决方案2】:

我认为无论哪种方式,性能都不是一个令人信服的论点。在我的 Mac 上,我运行了以下测试。

前 10,000 个包含一个除了设置变量之外什么都不做的文件:

<?php

$mtime = microtime(); 
$mtime = explode(' ', $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$starttime = $mtime; 

for ($i = 0; $i < 10000; $i++) {
    include("foo.php");
}


$mtime = microtime(); 
$mtime = explode(" ", $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$endtime = $mtime; 
$totaltime = ($endtime - $starttime); 
echo 'Rendered in ' .$totaltime. ' seconds.'; 
?>

每次运行大约需要 0.58 秒。 (请记住,包括 10,000 个。)

然后我编写了另一个脚本,查询数据库 10,000 次。它不选择任何真实数据,只选择SELECT NOW()

<?php
mysql_connect('127.0.0.1', 'root', '');
mysql_select_db('test');

$mtime = microtime(); 
$mtime = explode(' ', $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$starttime = $mtime; 

for ($i = 0; $i < 10000; $i++) {
    mysql_query("select now()");
}


$mtime = microtime(); 
$mtime = explode(" ", $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$endtime = $mtime; 
$totaltime = ($endtime - $starttime); 
echo 'Rendered in ' .$totaltime. ' seconds.';

?>

这个脚本每次在我的电脑上运行大约需要 0.76 秒。显然,有很多因素可能会影响您的具体情况,但是运行 MySQL 查询与使用包含没有显着的性能差异。 (请注意,我的测试中没有包含 MySQL 连接开销——如果您连接到数据库只是为了获取包含的数据,那会有所不同。)

【讨论】:

  • 对于相关的基准测试,您应该在脚本中只有一个包含语句,然后运行脚本 10000 次,而不是在单个 PHP 脚本中包含 10000 个包含并运行脚本一次。一方面,重复包含不适合操作码缓存,因为理论上每个包含都可以改变下一个包含的解析方式。在我的测试中,当 APC 禁用 时,包含基准测试的运行速度实际上快了 7 倍。 :-)
【解决方案3】:

这是一个非常明显的过早优化案例。除非您确实将其确定为生产环境中的真正瓶颈,否则永远不要尝试优化此类事情。

也就是说,使用像 APC 这样的操作码缓存(您正在使用操作码缓存,对吗?因为这是首先您应该优化的事情PHP),我的钱在包含文件上。

但同样,差异可能可以忽略不计,因此请选择需要 1) 最少代码和 2) 最少维护的解决方案。程序员的时间比 CPU 时间昂贵得多。

更新:我对包含定义 1000 项数组的 PHP 文件进行了快速基准测试。使用 APC 时脚本的运行速度比不使用时快 5 倍。

类似的基准测试,从 MySQL 数据库(在本地主机上)获取 1000 行,使用 APC 运行速度仅快 15%(因为 APC 对数据库查询没有任何作用)。

但是,一旦启用 APC,使用包含文件和使用数据库之间没有显着差异

【讨论】:

    【解决方案4】:

    鉴于大多数人会在常规页面的脚本中包含 10-20 个文件,我觉得包含比 MySQL 查询快得多。

    我可能是错的。

    问题是,如果这些值在您不进行其他修改(移动文件等)的情况下永远不会改变,那么它可能应该存储在包含文件中。

    如果数据是动态的,则应从数据库中提取。

    【讨论】:

      【解决方案5】:

      我认为这个决定不应该基于性能。我会问自己的问题:应用程序是否会更新这些数据。如果答案是“否”,请考虑将其作为包含数组实现和使用会更快、更简单。

      我使用一个大型系统,其中几乎所有可能的东西都存储在数据库中。即使是必须通过开发人员编写的数据库更改手动更改的数据,我可以告诉你,与按照客户建议的方式存储信息相比,它会导致更多的编码和复杂性。

      如果数据不会经常更改并且无论如何都必须通过手动干预进行更改并且不需要在数据库中提供(例如对于其他系统),请尝试使用数组。以后可以随时将其放入数据库中,编写所有必要的 SQL。

      【讨论】:

        猜你喜欢
        • 2012-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 1970-01-01
        • 2015-10-22
        相关资源
        最近更新 更多