2012-04-23 13 views
0

RDBMS、NewSQL、NoSQLを比較するためにphp benchmarkと書いています。 このスクリプトは単にクエリを実行し、実行時間を測定します。mongoDBと同等のmysql_query

は、MySQLのように、私は単純に使用してください:

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

私はベンチマークのデータをフェッチしませんでした。 $cursor$result当量(時間/データコスト)

しかし、MongoDBは、PHPで、機能はcursor

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

を返すfind()をしているのか?カーソルが、それは公平であるかどう

は私が思って... ..時間は、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はこのデータをメモリに格納しています。特に、直後に2回実行するとメモリが増えます。

+0

ありがとうございます。でも、私のやり方はいいと思う?それとも、私が考えていない別の解決策がありますか?例:MongoDB :: executeを使用しますか? – Kakawait

+0

Executeはクエリを実行するためのものではなく、任意のjavascriptを実行するためのものです。私は今までそれを使用する必要はなかった。ベンチマークのための最良の方法は、実際のアプリケーションを使用しているか、おそらく挿入テストを行うことです。 – Derick

+0

はい、私の例では選択クエリを選択しました..しかし、私のベンチマークは疑似実アプリケーション上で多くの異なるタイプのクエリ(選択、挿入、更新など)を実行します。しかし、私の問題は、mongodbがカーソルを使用するのでちょうど選択されています。 – Kakawait