什么更快?包括另一个文件或者在PHP中查询MySQL数据库?

时间:2020-03-06 15:04:00  来源:igfitidea点击:

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

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

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

解决方案

我完全不知道,但是在我的使用MySQL的opinio中,即使内容是动态的,即使可以变慢,也可以使用。但我敢肯定,对于大内容,使用include可以更快。

只要文件不是太大,肯定会包含,并且我们最终会使用过多的内存,在这种情况下,建议使用数据库

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

但是,可以肯定的是,鉴于良好的索引,良好的数据库结构/规范化以及不太花哨/复杂的查询,MySQL会更快。 I / O操作总是很昂贵(读:慢),而如前所述,整个数据集已由MySQL缓存在内存中。

此外,我想我们想过对包含的文件进行进一步的字符串操作,这使事情变得更加麻烦,我确信MySQL的字符串搜索算法的优化要比PHP所能提供的更好。

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

但是,听起来我们想查询该数据以便找到匹配项以返回到javascript。在这种情况下,我们可能会发现MySQL对于实际的数据查询/搜索(特别是如果正确建立索引等)会更快,因为这是数据库的优势。

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

这取决于。如果文件存储在本地服务器中,而数据库安装在另一台计算机上,则更快地包括该文件。

Buuuuut,因为它取决于系统,所以可能不正确。我建议我们制作一个PHP测试脚本并从命令行运行100次,然后通过HTTP(使用cURL)重复测试

例子:

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;

?>

如果这是我们要定期获取的内容,则可能有必要预取数据(从磁盘或者数据库中获取数据,没关系),并让脚本从诸如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);

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

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

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

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

  • 文件大小很小-文本数据不足100kb
  • 我是随机选择而不是搜索-索引没有区别
  • 连接时间-服务器负载较高时,打开文件并读入文件比连接数据库要快。尤其如此,因为操作系统将文件缓存在内存中

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

如果我们使用APC或者Xcache之类的PHP字节码缓存,则包含文件的速度可能会更快。如果我们使用的是PHP并且想要提高性能,那么绝对需要字节码缓存。

听起来我们正在考虑将静态数据保留在所包含的PHP脚本中,以避免访问数据库。我们基本上是在进行基本的缓存。只要我们有某种在数据确实发生更改时刷新该文件的方法,就可以正常工作。我们可能还想了解有关MySQL查询缓存的知识,以使对静态数据的SQL查询更快。或者Memcached用于将静态数据保留在内存中。