8

在 PHP 中,这更快;使用include('somefile.php')或通过简单SELECT查询来查询 MySQL 数据库以获得相同的信息?

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

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

4

12 回答 12

15

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

Buuuuut,因为这取决于您的系统,这可能不是真的。我建议你制作一个 PHP 测试脚本并从命令行运行 100 次,然后通过 HTTP 重复测试(使用 cURL)

例子:

使用_include.php

<?php

  start = microtime(true);

  include( 'somefile.php' );

  echo microtime(true)-start;

?>

使用_myphp.php

<?php

  start = microtime(true);

  __put_here_your_mysql_statements_to_retrieve_the_file__

  echo microtime(true)-start;

?>
于 2008-10-03T10:19:13.097 回答
4

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

然而,在实践中,差异可能并不重要。如果列表是动态的,那么将其存储在 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);
于 2008-10-03T11:01:24.320 回答
3

时间上的差异更多地取决于系统设计,而不是我敢说的底层技术。MySQL结果和文件都可以缓存在内存中,性能差异很小,可以忽略不计。

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

所以:做你认为对你和代码和数据的未来维护者最方便的事情。:-)

于 2008-10-03T10:42:49.443 回答
2

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

但是,更确切地说,一个安全的猜测是 MySQL 更快,给定良好的索引、良好的数据库结构/规范化以及不太花哨/复杂的查询。I/O 操作总是很昂贵(读取:慢),而如前所述,整个数据集已经被 MySQL 缓存在内存中。

此外,我想你想对那些包含的文件进行进一步的字符串操作,这让事情变得更加麻烦——我相信 MySQL 的字符串搜索算法比你在 PHP 中想出的优化得更好。

于 2008-10-03T10:02:32.833 回答
1

如果这是您要定期获取的内容,则可能值得预取数据(从磁盘或数据库,无关紧要)并让您的脚本从内存缓存(如 memcached)中提取数据。

于 2008-10-03T10:29:59.750 回答
1

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

对我来说,有几个不同的因素使文件比 MySQL 更快:

  1. 文件很小——文本数据不到 100kb
  2. 我是随机挑选而不是搜索——索引没有区别
  3. 连接时间——当服务器负载很高时,打开文件并读取它比连接到数据库要快。尤其如此,因为操作系统将文件缓存在内存中

底线是我对它进行了基准测试并比较了结果。对于我的工作量,文件系统更快。我怀疑如果我的数据集不断增长,那将会改变。我将密切关注性能,并准备在未来改变它的工作方式。

于 2008-10-03T16:00:51.197 回答
0

绝对包括,只要文件不是太大并且最终使用太多内存,在这种情况下建议使用数据库

于 2008-10-03T09:58:43.213 回答
0

从文件中将原始数据读入脚本通常比从数据库中读取要快。

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

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

于 2008-10-03T10:03:00.040 回答
0

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

于 2008-10-03T14:28:53.847 回答
0

如果您希望以后的术语数量会变得更大,那么最好使用带有全文搜索字段的 MySQL。

于 2008-10-03T14:36:33.317 回答
0

如果您使用 APC 或 Xcache 等 PHP 字节码缓存,包含文件可能会更快。如果您使用 PHP 并且想要性能,那么绝对需要字节码缓存。

听起来您正在考虑在包含的 PHP 脚本中保留静态数据,以避免访问数据库。你基本上是在做一个基本的缓存。这可以正常工作,只要您有某种方式在数据发生更改时刷新该文件。您可能还想了解 MySQL 查询缓存,以便更快地对静态数据进行 SQL 查询。或者 Memcached 用于将静态数据保存在内存中。

于 2008-10-03T16:21:18.393 回答
-3

我完全不知道,但在我使用 MySQL 的意见中,即使可以更慢,如果内容是动态的,也可以使用。但我很确定它会更快,对于大内容,使用包含。

于 2008-10-03T09:56:31.363 回答