include()更快还是数据库查询?

时间:2009-07-25 22:08:10

标签: php file-io

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

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

5 个答案:

答案 0 :(得分:6)

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

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

文件I / O必须从磁盘读取,这很慢,尽管还有智能缓存机制,用于将经常访问的文件保存在内存中。

对您的实际系统进行分析将是最明确的。

答案 1 :(得分:4)

我不认为表演无论如何都是令人信服的论据。在我的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连接开销 - 如果您只是为了获取所包含的数据而连接到数据库,那将会产生影响。)

答案 2 :(得分:4)

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

也就是说,使用像APC这样的操作码缓存(你 使用操作码缓存,对吗?因为那是你应该做的第一个事情为了优化PHP,我的钱在包含文件中。

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

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

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

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

答案 3 :(得分:3)

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

我可以,但是错了。

问题是如果没有你做其他修改(移动文件等),这些值永远不会改变,它应该存储在一个包含文件中。

如果数据是以任何方式动态的,则应从数据库中提取数据。

答案 4 :(得分:1)

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

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

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