0

php benchmarkRDBMS、NewSQL、および NoSQL を比較するために、a を作成しようとしています。このスクリプトは、クエリを実行して実行時間を測定するだけです。

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 サーバーから直接フェッチされるというのは本当ですか?

4

1 に答える 1

0

->find() を実行すると、実際にはカーソルが返されます。最初の結果を取得するまで、クエリは実行されません。その時点で、ドライバーはクエリを発行します。これにより、->limit() や ->skip() などでカーソルを変更できます。そうです、結果セットも反復する方が公平です。

はい、mongoDb カーソルを反復処理すると、MongoDB サーバーからデータがフェッチされます。MySQL のようなバッファリングされていないクエリはありません (両方が許可されます)。もちろん、MongoDB はこのデータもメモリ内に保持します。特に、2 回続けて実行する場合は特にそうです。

于 2012-04-23T12:16:19.540 に答える