2013-05-07 130 views
1

我正在开发一个用于在多个巨型数组上进行强烈计算的算法。现在我已经使用PHP数组来完成这项工作,但它似乎比我所需要的要慢。我正在考虑使用MySQLi表并将php数组转换为数据库行,然后开始计算以解决速度问题。MySQLi查询vs PHP Array,哪个更快?

在第一步,当我将一个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表?有没有人完成或了解关于此的任何基准测试?

我真的很感激任何帮助。

在此先感谢


UPDATE:

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

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

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

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

  • 该阵列耗时0.9秒。 (慢了400多倍)
  • mysqli表花了0.0021秒。
+0

知道的唯一方法就是做自己的基准测试。可能值得托管它在EC2上说,然后编写一个API来按需要推拉数据库,您可以在适当的硬件软件上运行它,支付使用费用 – 2013-05-08 00:05:19

+1

为了公平比较,您应该批量插入数组比逐行插入更快。但@Dagon提到的正确方法是自己测试。你有性能测试作为你的问题的标签,所以做一些性能测试。 – 2013-05-08 00:18:24

+0

影响此类性能的因素数量非常巨大,只需通过调整一些数据库索引就可以将脚本运行时间缩短一小时。 – 2013-05-08 00:27:26

回答

-1

在我的情况下,如问题的更新部分所示,我认为数组比mysql数据库有更好的性能。

即使当我搜索单元格以在一行中查找所需值时,数组使用的响应速度也会提高10倍。即使表格的良好索引也无法打败阵列功能和速度。

0

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

数据库打算 - 首先 - 到商店数据。永久保存。它做得很好。它也可以做计算,但是再次 - 在做任何计算之前,有一个必要的步骤 - 存储数据。
如果您想对存储的数据进行计算 - 可以使用数据库。
如果您只想将数据推送到数据库中进行计算,这并没有多大意义。

+0

感谢您的回答。我试图看看我的计算中是否有大量的索引需求,可以通过数据库进行改进。在数组中,我需要扫描所有单元格以获得所需的值,但在数据库中,查询可能会更快地找到它。 – SAVAFA 2013-05-08 18:11:17

1

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