在PHP中,哪个更快 - 读取文件或数据库调用?

时间:2010-10-06 22:17:17

标签: php database performance optimization file-io

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

存储快速召回的最佳方法是什么?一个包含XML,JSON或序列化对象的平面文件?一个包含大量XML,JSON或序列化对象的数据库记录?或者数据库表中有4000条记录?

我意识到不同的服务器配置会有所作为,但是假设一个开箱即用的共享主机方案,或本地WAMP或其他一些简单的设置。

9 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:5)

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

这完全取决于环境;如果这是至关重要的,你应该测量它。否则将它放在您认为更容易接近的地方。

答案 2 :(得分:3)

我将它放在一个可以缓存的文件中,在(或者甚至每个?)页面加载上节省了大量不必要的数据库调用。你如何存储它并不重要,无论什么最适合你。速度方面,4000字应该不是问题。

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

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

如果你一直需要所有4000内存,那就无法查询数据库,尽管我可能错了。序列化对象听起来很简单,我认为它可以在这么多单词上表现得很好。

答案 5 :(得分:1)

如果你能够使用 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');

答案 6 :(得分:0)

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

如果该列表发生变化,您将可以更灵活地使用数据库。

答案 7 :(得分:0)

如果您只是需要知道哪一个更快,我将使用数据库。除了速度之外,使用DB更安全,更易于使用。但是,要小心使用正确的数据类型,如ntext(MS-SQL服务器)或BLOB(oracle)。

答案 8 :(得分:0)

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

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

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