2012-04-23 74 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