【问题标题】:MySQLi query vs PHP Array, which is faster?MySQLi 查询与 PHP 数组,哪个更快?
【发布时间】:2013-05-02 02:02:37
【问题描述】:

我正在开发一种算法,用于在多个大型数组上进行密集计算。现在我已经使用 PHP 数组来完成这项工作,但是它似乎比我需要的要慢。我正在考虑使用 MySQLi 表并将 php 数组转换为数据库行,然后开始计算以解决速度问题。

在第一步,当我将一个 20*10 的 PHP 数组转换为 200 行包含零的数据库时,花了很长时间。这是代码:(如果您有兴趣知道,基本上下面的代码正在生成一个零矩阵)

$stmt = $mysqli->prepare("INSERT INTO `table` (`Row`, `Col`, `Value`) VALUES (?, ?, '0')"); 
for($i=0;$i<$rowsNo;$i++){
    for($j=0;$j<$colsNo;$j++){
        //$myArray[$j]=array_fill(0,$colsNo,0);
        $stmt->bind_param("ii", $i, $j); 
        $stmt->execute(); 
    }
}
$stmt->close();

注释掉的行“$myArray[$j]=array_fill(0,$colsNo,0);"在接下来的两行填写表格时会非常快地生成数组,需要很长时间。

阵列时间:0.00068 秒

MySQLi 时间:25.76 秒

剩下的计算量更多,即使修改了许多部分,我也很担心它可能会变得更糟。我搜索了很多,但我找不到任何关于数组是更好的选择还是 mysql 表的答案?有人做过或知道这方面的任何基准测试吗?

非常感谢任何帮助。

提前致谢


更新:

我对 273*273 矩阵进行了以下测试。我为相同的数据创建了两个版本。第一个是二维 PHP 数组,第二个是 273*273=74529 行的表,两者都包含相同的数据。以下是从两者中检索相似数据的速度测试结果[在这里,找出某一行的哪些列的值等于1-其他列为零]:

  • 阵列花费了 0.00021 秒
  • mysqli 表花了 0.0026 秒。 (慢 10 倍以上)

我的结论是坚持使用数组而不是将它们转换为数据库表。

最后要说的是,如果提到的数据首先存储在数据库表中,生成一个数组然后使用它会慢得多,如下所示(由于从数据库中检索数据而变慢):

  • 阵列需要 0.9 秒。 (慢了 400 多倍)
  • mysqli 表耗时 0.0021 秒。

【问题讨论】:

  • 了解的唯一方法是进行自己的基准测试。可能值得在 ec2 上托管它,然后编写一个 api 来根据需要推送拉取数据,您可以在适当的硬件软件上运行它,按使用费付费
  • 为了公平比较,您应该批量插入数组,这比逐行插入要快得多。但是@Dagon 提到的正确方法是自己测试。您确实将性能测试作为问题的标签,因此请进行一些性能测试。
  • 影响这种性能的因素数量巨大,通过调整一些数据库索引只需四分之一小时的脚本运行时间。
  • 如果你的计算是用 MySQL 编写的,你只会获得性能提升 - 否则,无论如何你总是需要将表加载回内存中......我不是 PHP 开发人员),插入的速度很慢可能更多地与为目标表中的每个单元格创建数据库连接有关。为了速度,您应该考虑某种bulk insert 方法。您的 (row,col,value) 表也可能不利于性能 - 您可以重新设计吗?
  • 感谢您的回复。 Dagon 和 Mike,我正在本地主机上编写我自己的基准测试,并将让您知道结果。 Simon 我正在创建自己的代码,而且我绝对可以重新设计它们。 “批量插入”的问题在于,这些数据矩阵是在代码内部生成的,数千次,并且不是文件中使用您提到的该功能的预定义数据。它旨在成为一个具有大量计算迭代的遗传算法应用程序。

标签: php arrays mysqli benchmarking performance-testing


【解决方案1】:

主要原因不是数据库本身比较慢。主要原因是数据库访问硬盘存储数据,PHP函数只使用RAM内存来执行这个过程,比硬盘快。

【讨论】:

    【解决方案2】:

    就我而言,如问题的更新部分所示,我认为数组比 mysql 数据库具有更好的性能。

    即使我在单元格中搜索以连续查找所需值时,数组使用的响应速度也快了 10 倍。即使是良好的表索引也无法超越数组的功能和速度。

    【讨论】:

      【解决方案3】:

      虽然有一种方法可以加快您的插入查询(很可能您使用的是没有事务的 innodb 表),但问题的陈述是错误的。

      一个旨在存储数据的数据库。永久保存。它做得很好。它也可以进行计算,但同​​样 - 在进行任何计算之前,有一个必要步骤 - 存储数据。
      如果您想对存储的数据进行计算 - 可以使用数据库。
      如果您只想将数据推送到数据库中以进行计算 - 这没有太大意义。

      【讨论】:

      • 感谢您的回答。我正在尝试查看是否可以通过数据库来改进我计算的大量多重索引需求。在数组中,我需要扫描所有单元格以获得所需的值,但在数据库中,查询可能会更快地找到它。
      猜你喜欢
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多