速度更快;包括另一个文件或查询PHP中的MySQL数据库?

问题描述:

在PHP中,速度更快;使用include('somefile.php')或使用简单的SELECT查询查询MySQL数据库以获取相同的信息?速度更快;包括另一个文件或查询PHP中的MySQL数据库?

例如,假设您有一个JavaScript自动填充搜索字段,需要使用3,000个字词进行匹配。使用include从另一个文件中读取这些术语还是使用简单的SELECT查询从MySQL数据库中读取它们更快?

编辑:这是假设我要包含的数据库和文件与我的代码位于同一本地计算机上。

+0

请注意,读取数据是一回事,但与该数据匹配是另一个重要性能明智的步骤。所以你的问题可能不会邀请你需要的答案。 – bart 2015-07-19 18:03:50

这取决于。如果您的文件存储在本地服务器中,并且数据库安装在另一台计算机上,则包含该文件的速度越快。

Buuuuut,因为它取决于你的系统,它可能不是真的。我建议你做一个PHP测试脚本和命令行运行它的100倍,并通过HTTP重复测试(使用卷曲)

例子:

use_include.php

<?php 

    start = microtime(true); 

    include('somefile.php'); 

    echo microtime(true)-start; 

?> 

use_myphp。PHP

<?php 

    start = microtime(true); 

    __put_here_your_mysql_statements_to_retrieve_the_file__ 

    echo microtime(true)-start; 

?> 

我完全不知道,但在我的确信使用MySQL,即使可以更慢,如果内容是动态的,应该使用。但我很确定它更快,对于大内容,使用include。

只要该文件不是太大肯定有和你最终使用在这种情况下,数据库将被推荐

太多的内存也很难/不可能给出一个确切的答案,因为有太多未知的变量 - 如果文件系统安装在位于世界另一端的NFS上怎么办?或者你有内存中的整个MySQL数据库。数据库的大小也应该考虑在内。

但是,在更多的答案注释中,如果索引良好,数据库结构/规范化良好以及不太花哨/复杂的查询,则MySQL可以更快地得到。 I/O操作总是很昂贵(读取:慢),而如前所述,整个数据集已被MySQL缓存在内存中。另外,我想你还想用这些包含文件进行进一步的字符串处理,这使得事情变得更加麻烦 - 我确信MySQL的字符串搜索算法比你在PHP中提出的要好得多。

从原始数据读取文件中的脚本一般会比数据库更快。

但是,它听起来像你想要查询该数据,以找到匹配返回到JavaScript。在这种情况下,您可能会发现MySQL对数据的实际查询/搜索会更快(尤其是在正确索引等情况下),因为这是数据库擅长的。

读取大文件的可伸缩性也较差,因为在脚本执行时您将使用大量服务器内存。

如果这是你将要定期取东西它可能是值得的预取的数据(从磁盘或数据库,无所谓),并让您的脚本拉来自像memcached这样的RAM缓存。

时间上的差异比我敢说的底层技术更多的是系统设计。 MySQL结果和文件都可以缓存在内存中,并且性能差异会很小,因此可以忽略。

相反,我会问自己,维护方面的差异是什么。你可能会改变数据吗?如果没有,只需将它弹出一个纯文件。你是否可能经常改变内容的某些部分?如果是这样,数据库更容易操作。数据结构也是如此,如果需要“重组”,也许将数据放入数据库会更有效率?

所以:做你觉得最方便的方式为你和代码和数据的未来维护者。 :-)

包括一个文件应该几乎总是更快。如果您的数据库位于另一台机器上(例如在共享主机中)或多服务器设置中,查找将不得不额外跳跃一次。

但是,在实践中,差异可能无关紧要。如果列表是动态的,那么将其存储在MySQL中将使您的生活更轻松。静态列表(例如国家或州)可以存储在PHP包含中。如果列表非常短(有几百条)并且经常使用,则可以直接将它加载到JavaScript中,并取消AJAX。

如果你要去MySQL路线,并担心速度,然后使用缓存。

$query = $_GET['query']; 
$key = 'query' . $query; 
if (!$results = apc_fetch($key)) 
{ 
    $statement = $db->prepare("SELECT name FROM list WHERE name LIKE :query"); 
    $statement->bindValue(':query', "$query%"); 
    $statement->execute(); 
    $results = $statement->fetchAll(); 
    apc_store($key, $results); 
} 

echo json_encode($results); 
+0

这是我能想象的最好的方式。即使文件系统最初速度较快,也不会比编写您正在使用的PDO驱动程序的人写出更快的文件选择逻辑。 – Kris 2009-05-28 22:06:27

为什么不这样做,看看哪个更快?两种解决方案都非常简单。

如果您预计稍后日期的条款数量会变大,您最好使用带有fulltext search字段的MySQL。

我最近有这个问题。我在每个页面请求中查询了一些mysql数据。对于我的数据集,编写固定记录长度文件比使用MySQL更快。

有报道说,做了一个文件的速度比MySQL的我几个不同的因素:

  1. 文件大小小 - 在文本数据
  2. 我随机挑选,而不是搜索的100KB - 索引没有区别
  3. 连接时间 - 打开文件并读取文件比在服务器负载较高时连接数据库要快。这是特别真实的,因为操作系统在内存中缓存文件

底线是我基准和比较结果。对于我的工作负载,文件系统更快。我怀疑,如果我的数据集增长,这将会改变。我将关注性能,并且我准备好改变未来的工作方式。

如果使用像APC或Xcache这样的PHP字节码缓存,包括该文件可能会更快。如果您使用PHP并且需要性能,则字节码缓存绝对是必需的。

听起来好像您正在考虑在您包含的PHP脚本中保留静态数据,以避免触碰数据库。你基本上在做一个基本的缓存。这可以正常工作,只要你有一些方法可以在数据发生变化时刷新该文件。您也可能希望了解有关MySQL查询缓存的内容,以便更快地对静态数据进行SQL查询。或Memcached将静态数据保存在内存中。