2013-05-07 138 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內存來執行此過程,這比硬盤驅動器更快。