2012-04-23 27 views
0

我試圖編寫一個php benchmark來比較一些RDBMS,NewSQL和NoSQL。 該腳本只執行查詢並測量執行時間。相當於mongoDB的mysql_query

對於類似MySQL的,我簡單地使用:

$start = microtime(true); 
$result = mysql_query($SQL); 
$end = microtime(true); 

我沒有爲我的基準獲取數據。

但隨着MongoDB中的PHP,功能find()返回cursor

$start = microtime(true); 
$collection = $this->_db->selectCollection($collection); 
$cursor = $collection->find($query); 
$end = microtime(true); 

是否$cursor$result當量(時間/數據費用)?遊標不加載數據,我必須迭代遊標才能加載數據。那爲什麼執行MySQL和mongoDB之間的查詢的時間是如此不同或只是mongoDB岩石...

我想知道它是否會更公平我的代碼更改爲:

$start = microtime(true); 
$result = mysql_query($SQL); 
while ($row = mysql_fetch_row($result)) {} 
$end = microtime(true); 

$start = microtime(true); 
$cursor = $collection->find($query); 
foreach ($cursor as $doc) {} 
$end = microtime(true); 

最後,是這樣說,每次在MongoDB的光標數據迭代時間都是直接從MongoDB的服務器上獲取,而不是從計算機內存?

回答

0

正在運行 - > find()確實只是返回遊標。直到您獲取第一個結果,查詢纔會執行。此時,驅動程序將發出查詢。這允許你用 - > limit()和 - > skip()這樣的東西修改遊標。所以是的,迭代結果集也會更公平。

是的,遍歷mongoDb遊標,數據是從MongoDB服務器獲取的。有沒有無緩衝的查詢,如MySQL(它允許)。當然,MongoDB也會將這些數據存儲在內存中 - 尤其是如果你一次接一次地執行兩次。

+0

好的,謝謝你是對的。但你認爲我的做法很好嗎?或者還有另一個我沒有想到的解決方案?例如:使用MongoDB :: execute? – Kakawait 2012-04-23 12:20:14

+0

執行並不意味着運行查詢,只是爲了運行一些任意的javascript。到目前爲止,我從來沒有必要使用它。基準測試最好的方法是獲得真正的應用程序,或者進行插入測試。 – Derick 2012-04-23 12:33:44

+0

是的,對於我的示例,我選擇了select查詢..但是,我的基準測試將在僞真實應用程序上執行許多不同類型的查詢(選擇,插入,更新等)。但我的問題是關於選擇,因爲mongodb使用光標。 – Kakawait 2012-04-23 12:55:30